gpt4 book ai didi

java - Java 中的真实类与表面类

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:07:39 26 4
gpt4 key购买 nike

class A { public static void main(String[] args) 
{ A a = new A();
B b = new B();
A ab = new B();
System.out.format("%d %d %d %d %d %d", a.x, b.x, ab.x, a.y, b.y, ab.y); }
int x = 2;
int y = 3;
A(int x) { this.x = x; }
A() { this(7); } }

class B extends A {
int y = 4;
B() { super(6);
}

大家好,我刚刚浏览了我类(class)中的一些示例,遇到了这个困扰我的问题。
我意识到这段代码应该打印出来“7 6 6 3 4 3”

但为什么 ab.y 等于 3?不是 B 类的对象 ab 的“真实”类型吗?哪一个会让我相信 ab.y 是 4?

最佳答案

因为您是直接访问字段,而不是通过 getter 方法。

您不能覆盖字段,只能覆盖方法

B 除了父类 A 中的字段外,还有一个字段 y。这两个字段不会相互干扰,选择哪个字段是在编译时确定的(由编译器已知的类型)。

如果你说

   A ab = new B(); 

然后

  ab.y

将被编译以查看类 A 中声明的字段 y。这不会在运行时分派(dispatch)给真实实例的类。静态方法也是如此。

如果你这样做

    B ab = new B();

然后你得到类 B 中的字段。

关于java - Java 中的真实类与表面类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3809139/

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