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);
}
Run Code Online (Sandbox Code Playgroud)
嘿所有,我只是通过我的课程中的一些例子,并遇到了困扰我的这个问题.
我意识到这段代码应打印出来"7 6 6 3 4 3"
但为什么ab.y等于3?不是B类的"真实"对象类型ab吗?那会让我相信ab.y是4?
因为您是直接访问字段,而不是通过getter方法.
您不能覆盖字段,只能覆盖方法.
除了父类中的类之外,类B还有一个字段.这两个字段不会相互干扰,一个被拾取的字段在编译时确定(通过编译器已知的类型).yA
如果你说
A ab = new B();
Run Code Online (Sandbox Code Playgroud)
然后
ab.y
Run Code Online (Sandbox Code Playgroud)
将被编译以查看y在类中声明的字段A.这不会在运行时调度到实例的类.静态方法也是如此.
如果你这样做
B ab = new B();
Run Code Online (Sandbox Code Playgroud)
然后你在课堂上得到了这个领域B.
| 归档时间: |
|
| 查看次数: |
1312 次 |
| 最近记录: |