在以下示例中:
class Base {
int x=10;
Base() {
show();
}
void show() {
System.out.print ("Base Show " +x + " ");
}
}
class Child extends Base {
int x=20;
Child() {
show();
}
void show() {
System.out.print("Child Show " + x +" ") ;
}
public static void main( String s[ ] ) {
Base obj = new Child();
}
}
Child Show 0 Child Show 20
- 我认为构造函数只能在其超级构造函数完成后才能访问实例成员。
我认为这里发生的事情是超级构造函数正在调用子级的 show() 方法,因为该方法在 Child 中被重写。因为它已被重写,但为什么 x 的值为 0,为什么它能够在超级构造函数完成之前访问此方法?
我认为这里发生的事情是超级构造函数正在调用子级的 show() 方法,因为该方法在 Child 中被重写。
那是对的
但为什么 x 的值为 0
因为它还没有初始化(Child的x)
为什么它能够在超级构造函数完成之前访问这个方法?
这就是为什么在构造函数中永远不应该调用可以被覆盖的方法(非最终公共和受保护)。
Edit:
这里奇怪的是,所有内容都具有默认/包私有可见性。这可能会产生一些奇怪的效果。看:http://www.cooljeff.co.uk/2009/05/03/the-subtleties-of-overriding-package-private-methods/
我建议尽可能避免覆盖具有默认可见性的方法(您可以通过将它们声明为最终的来防止这种情况)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)