Что означает переопределение статических методов в Java? - PullRequest
12 голосов
/ 07 июля 2011

Я читал раздел по статике в учебном пособии SCJP, в котором упоминается следующее:

статические методы не могут быть переопределены, но они могут быть переопределены

Что на самом деле означает переопределение? Является ли это случаем наличия статического метода, который существует как в родительском, так и в дочернем элементах, с одинаковой сигнатурой, однако на них отдельно ссылаются имена классов? Такие как:

class Parent
{
   static void doSomething(String s){};
}

class Child extends Parent
{
   static void doSomething(String s){};
}

Обозначается как: Parent.doSomething(); и Child.doSomething();?

Кроме того, относится ли это к статическим переменным или только к статическим методам?

Ответы [ 3 ]

17 голосов
/ 07 июля 2011

Это просто означает, что функции не являются виртуальными. В качестве примера, скажем, что у вас есть объект (во время выполнения) типа Child, на который ссылается переменная типа Parent. Затем, если вы вызываете doSomething, вызывается метод doSomething Родителя:

Parent p = new Child();
p.doSomething(); //Invokes Parent.doSomething

Если бы методы были нестатичными, doSomething для Child переопределил бы метод для Parent и child.doSomething было бы вызвано.

То же самое относится и к статическим полям.

6 голосов
/ 07 июля 2011

Статический означает, что есть один на класс, а не один на объект. Это верно как для методов, так и для переменных.

Статическое поле подразумевает, что существует одно такое поле, независимо от того, сколько объектов этого класса создано. Пожалуйста, посмотрите на Есть ли способ переопределить переменные класса в 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 и добавите его в Child, результаты будут другими.

@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, вы можете получить доступ к статическому ключу Child.

0 голосов
/ 25 марта 2013

В ответе rajah9, если теперь мы сделаем два метода статичными как в parent, так и в child:

public static void getKey() {
        System.out.println("I am in and my key is " + key);
    }

Две вещи, на которые стоит обратить внимание: Невозможно использовать this.getClass () и предупреждение «Статический метод getKey () из типа Parent должен быть доступен статически»

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
...