gpt4 book ai didi

java - 理解类成员行为多态性

转载 作者:搜寻专家 更新时间:2023-11-01 02:18:57 24 4
gpt4 key购买 nike

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

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。

最佳答案

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

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

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

Ax成员的值为1(由构造函数设置public A() { x=1 ; y=2; }).

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

Ay成员的值为4(由构造函数设置 public B() { super() ;x=3;y=4;z=5;).

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

顺便说一句,第 20 行有一个编译错误。为了执行您的代码,我不得不将其注释掉。

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

关于java - 理解类成员行为多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56832159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com