Что означает переопределение статических методов в Java?
Я читал раздел о статике в учебном пособии SCJP, и в нем упоминается следующее:
статические методы не могут быть переопределены, но их можно переопределить
что на самом деле означает переопределение? Является ли это случаем статического метода, который существует как в Родительском, так и в дочернем, с той же сигнатурой, однако на них ссылаются отдельно по их именам классов? Например :
class Parent
{
static void doSomething(String s){};
}
class Child extends Parent
{
static void doSomething(String s){};
}
упоминается как : Parent.doSomething();
и Child.doSomething();
?
кроме того, то же самое относится к статическим переменным или просто статическим методам?
3 ответов
Это просто означает, что функции не являются виртуальными. В качестве примера предположим, что у вас есть объект (runtime) типа Child, на который ссылается переменная типа Parent. Тогда, если вы вызываете doSomething
на doSomething
вызывается метод родителя:
Parent p = new Child();
p.doSomething(); //Invokes Parent.doSomething
если методы не статические, doSomething
ребенка будет переопределять Родительский и child.doSomething
был бы вызван.
то же самое относится к статическим полям.
Static означает, что существует один на класс, а не один на объект. Это справедливо как для методов, так и для переменных.
статическое поле будет означать, что есть одно такое поле, независимо от того, сколько объектов этого класса создаются. Пожалуйста, взгляните на есть ли способ переопределить переменные класса в Java? на вопрос о переопределении статического поля. Короче говоря: статическое поле нельзя переопределить.
рассмотрим следующий пример:
public class Parent {
static int key = 3;
public void getKey() {
System.out.println("I am in " + this.getClass() + " and my key is " + key);
}
}
public class Child extends Parent {
static int key = 33;
public static void main(String[] args) {
Parent x = new Parent();
x.getKey();
Child y = new Child();
y.getKey();
Parent z = new Child();
z.getKey();
}
}
I am in class tools.Parent and my key is 3
I am in class tools.Child and my key is 3
I am in class tools.Child and my key is 3
ключ никогда не возвращается как 33. Однако, если вы переопределите getKey и добавите это к дочернему, результаты будут другими.
@Override public void getKey() {
System.out.println("I am in " + this.getClass() + " and my key is " + key);
}
I am in class tools.Parent and my key is 3
I am in class tools.Child and my key is 33
I am in class tools.Child and my key is 33
переопределяя метод getKey, вы можете получить доступ к статическому ключу ребенка.
в ответе rajah9, если теперь мы сделаем два метода статическими как в Родительском, так и в дочернем:
public static void getKey() {
System.out.println("I am in and my key is " + key);
}
две вещи, чтобы отметить сейчас: Не могу использовать это.getClass () "и предупреждение" статический метод getKey () из родительского типа должен быть доступен статическим способом " также
Parent z = new Child();
z.getKey();
даст выход
I am in class tools.Parent and my key is 3
вместо
I am in class tools.Parent and my key is 33