了解班级成员的行为多态性

אבר*_*ובו 4 java polymorphism inheritance

在尝试理解时遇到了一些困难,当我们启动一个子类的实例时实际上会发生什么。

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); 
Run Code Online (Sandbox Code Playgroud)

我想在这里对发生的确切情况进行详细的解释,但是我不明白的主要是为什么行'21'打印数字1,而行'23'打印数字4。

Era*_*ran 5

多态性适用于方法,不适用于实例变量。

第21和23行都打印class实例变量的值A,因为这是的编译时类型o2(即使其运行时类型为B)。

21. System.out.println(o2.x); 
Run Code Online (Sandbox Code Playgroud)

Axmember 值是1(由构造函数设置public A () { x=1; y=2; })。

23. System.out.println(o2.y); 
Run Code Online (Sandbox Code Playgroud)

Aymember 值是4(由构造函数设置public B () { super(); x=3; y=4; z=5; })。

请注意,其中B有一个x实例变量隐藏A了同名的变量。因此B,构造函数不会将Ax变量更改为3。另一方面,B由于没有y实例变量,因此y=4;Ay变量值更改为4

顺便说一句,第20行有一个编译错误。我必须将其注释掉才能执行您的代码。

另请注意,o2.getx()给出的结果与相比有所不同o2.x,因为getx()是被类覆盖的方法B,所以它返回B的实例变量x,其值是3(由于运行时类型o2B)。