在以下示例中:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)Child Show 0 Child Show 20
我认为这里发生的是超级构造函数调用子的show()方法,因为这个方法在Child中被重写.因为它已被覆盖,但为什么x 0的值和为什么它能够在超级构造函数完成之前访问此方法?
Puc*_*uce 11
我认为这里发生的是超级构造函数调用子的show()方法,因为这个方法在Child中被覆盖.
那是正确的
但为什么x 0的值
因为它尚未初始化(儿童的x)
为什么在超级构造函数完成之前它能够访问此方法?
这就是为什么在构造函数中你永远不应该调用一个可以被覆盖的方法(非最终公共和受保护).
编辑:
这里奇怪的是,一切都有默认/包私有的可见性.这可能会产生一些奇怪的效果.请参阅:http://www.cooljeff.co.uk/2009/05/03/the-subtleties-of-overriding-package-private-methods/
我建议尽可能避免使用默认可见性覆盖方法(您可以通过将它们声明为final来防止这种情况).
你可以从构造函数中调用overriden方法,但这很糟糕,你不应该这样做.你说明了这个错误的原因:派生类没有机会进行初始化,因此将使用未初始化的字段 - 在你的例子中,intx 的默认值是0,这就是它打印的原因0.
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |