Что означает переопределение статических методов в 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