Что означает переопределение статических методов в Java?

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

  

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

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

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

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

Ссылка: Parent.doSomething(); и Child.doSomething();?

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

12 голосов | спросил Jimmy 7 J000000Thursday11 2011, 15:25:51

3 ответа


0

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

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

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

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

ответил Mathias Schwarz 7 J000000Thursday11 2011, 15:32:18
0

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

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

ответил rajah9 7 J000000Thursday11 2011, 16:15:50
0

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

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
ответил Jyoti Prakash 25 MaramMon, 25 Mar 2013 10:43:02 +04002013-03-25T10:43:02+04:0010 2013, 10:43:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132