public class A {
public A() { init(); }
protected void init() {}
static class B extends A {
int i, j = 999;
protected void init() {
System.out.println("i=" + i + ", j=" + j); // 輸出 0, 0
i = 888; j = 111;
}
}
public static void main(String[] args) {
B b = new B();
System.out.println("i=" + b.i + ", j=" + b.j); // 輸出 888, 999
}
}
new B() → 隱式調用 super() → 執行 A() 構造器。A() 調用 init(),因多態調用 B.init()。B 的字段 i 默認值 0,j 顯式初始化 999 尚未執行(字段初始化在構造器體之前,但父類構造器先於子類字段初始化運行)。B.init() 打印 0, 0(注意:j 的顯式賦值 999 尚未執行,因子類字段初始化在父類構造器完成後、子類構造器體之前)。j = 999(覆蓋了 init() 中的 111),i 無顯式初始化保持 888。b.i=888, b.j=999。構造器中不要調用可被重寫的方法(即非 private、final、static 方法)。此時子類尚未完全初始化,字段可能處於默認值狀態,導致邏輯錯誤。
private 方法或構造器體直接編寫。init())。