Понимание поведения учеников Полиморфизм - PullRequest
4 голосов
/ 01 июля 2019

Я сталкиваюсь с некоторыми трудностями, пытаясь понять, что на самом деле происходит, когда мы инициируем экземпляр дочернего класса.

public class A { 
2.      public int x, y; 
3.      public A () { x=1; y=2; }
4.      public int getx () { return x; }
5.  }
6.  public class B extends A { 
7.      public int x, z; 
8.      public B () { super(); x=3; y=4; z=5; }
9.      public int getx () { return x; } 
10.     public int getz () { return z; } 
11. }
12. public class Prob1 { 
13.     public static void main (String[] args){
14.         A o1 = new A(); 
15.         A o2 = new B(); 
16.         B o3 = new B();
17.         System.out.println(o1.x);     
18.         System.out.println(o1.getx()); 
19.         System.out.println(o1.y); 
20.         System.out.println(o1.getz()); 
21.         System.out.println(o2.x); 
22.         System.out.println(o2.getx());
23.         System.out.println(o2.y); 

Я бы хотел здесь подробно объяснить, что здесь происходитточно, но главное, что я не могу понять, это то, почему строка «21» печатает число 1, а строка «23» печатает число 4.

1 Ответ

5 голосов
/ 01 июля 2019

Полиморфизм применяется к методам, а не к переменным экземпляра.

Обе строки 21 и 23 печатают значение переменных экземпляра класса A, поскольку это тип времени компиляции o2 (даже если его тип времени выполнения равен B).

21. System.out.println(o2.x); 

Значение элемента A x равно 1 (устанавливается конструктором public A () { x=1; y=2; }).

23. System.out.println(o2.y); 

Значение A элемента y равно 4 (устанавливается конструктором public B () { super(); x=3; y=4; z=5; }).

Обратите внимание, что B имеет переменную экземпляра x, которая скрывает переменную A с тем же именем. Поэтому конструктор B не меняет переменную A x на 3. С другой стороны, B не имеет переменной экземпляра y, поэтому y=4; изменяет значение переменной A y на 4.

Кстати, в строке 20 есть ошибка компиляции. Я должен был закомментировать его, чтобы выполнить ваш код.

Также обратите внимание, что o2.getx() дает результат, отличный от o2.x, поскольку getx() является методом, переопределенным классом B, поэтому он возвращает переменную экземпляра B x, значение которой 3 (поскольку тип времени выполнения o2 равен B).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...