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);
}
嘿所有,我只是从我的课程中查看一些例子,并遇到了这个难以理解的问题 我意识到了 这段代码应该打印出来 “7 6 6 3 4 3”
但为什么ab.y等于3?不是B类的“真实”对象类型ab吗? 那会让我相信ab.y是4?
答案 0 :(得分:8)
因为您是直接访问字段,而不是通过getter方法。
您无法覆盖字段,只能覆盖方法。
类B
除了父类y
中的字段A
之外还有一个字段 A ab = new B();
。这两个字段不会相互干扰,一个被拾取的字段在编译时确定(按编译器已知的类型)。
如果你说
ab.y
然后
y
将编译以查看在类A
中声明的字段 B ab = new B();
。这不会在运行时调度到实例的类。静态方法也是如此。
如果你这样做
B
然后你会在课程{{1}}中找到该字段。