public class Base {
public Base() {
x = 0;
bar();
}
public Base(int x) {
this.x = x;
foo();
}
public void foo() {
System.out.println("Base.foo : " + x);
}
private void bar() {
System.out.println("Base.bar:" + x.toString());
}
protected Integer x;
}
public class Derived extends Base {
public Derived() {
bar();
}
public Derived(int x, int y) {
super(x);
this.y = y;
}
public void foo() {
System.out.println("Derived.foo : " + x + ", " + y);
}
public void bar() {
System.out.println("Derived.bar:" + x.toString() + ", " + y.toString());
}
private Integer y;
public static void main(String[] args) {
Base b = new Derived(10, 20);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么打印"Derived.foo:" 10, nulll而不是20而不是null?y是Derived的私有变量,它用20初始化.它在其范围内..那么为什么它为null?
因为超级构造函数首先被调用(super(x)).这个超级构造函数调用方法foo.然后Derived构造函数将y初始化为20(this.y = y).因此,当调用foo时,y尚未初始化.
在构造函数中调用可覆盖的方法是一种不好的做法,因为正如您刚才注意到的,它可以在部分构造的对象上调用重写方法.
| 归档时间: |
|
| 查看次数: |
367 次 |
| 最近记录: |