אבר*_*ובו 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。
多态性适用于方法,不适用于实例变量。
第21和23行都打印class实例变量的值A,因为这是的编译时类型o2(即使其运行时类型为B)。
21. System.out.println(o2.x);
Run Code Online (Sandbox Code Playgroud)
A的xmember 值是1(由构造函数设置public A () { x=1; y=2; })。
23. System.out.println(o2.y);
Run Code Online (Sandbox Code Playgroud)
A的ymember 值是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)。
| 归档时间: |
|
| 查看次数: |
46 次 |
| 最近记录: |