インスタンスの初期化の段階は、たとえばこの質問でキャプチャされます。それにもかかわらず、インスタンス変数が宣言されて自動初期化される瞬間を捉えていません。
以下のテスト コードから、Child クラスのインスタンス初期化子が実行される前でも、Child クラスのインスタンス変数 int "i" にアクセスできることがわかります。しかし、この i 変数はいつ宣言され、自動初期化されたのでしょうか?
コード
class Parent{
static{ System.out.println("Static Parent initialization"); }
int i=1234;
{ System.out.println("Parent's instance initializer running");
print("executed from Parent's instance initializer");
update(1);
}
Parent() {
System.out.println("Parent's constructor running");
print("executed from Parent's constructor");
update(2);
}
void print(String note) { System.out.println("never executed"); }
void update(int newI){ System.out.println("never executed"); }
}
class Child extends Parent{
static{ System.out.println("Static Child initialization"); }
int i = 3;
{System.out.println("Child's instance initializer; i=" + i); }
Child(){super(); i=4; System.out.println("Child's constructor running. Setting i to 4");}
void print(String note) { System.out.println("print(): '"+note.toUpperCase()+"' ; i="+i); }
void update(int newI){i=newI;System.out.println("update("+newI+"): After update i="+i);}
}
class Context {
public static void main(String[] args) {
Parent parent = new Child();
System.out.println("In main: child's i="+((Child)parent).i);
System.out.println("In main: parent's i=" +parent.i);
}
}
出力
静的な親の初期化
静的な子の初期化
親のインスタンス初期化子の実行中
print(): '親のインスタンス初期化子から実行' ; i=0
update(1): 更新後 i=1
親のコンストラクターの実行中
print(): '親のコンストラクターから実行' ; i=1
update(2): 更新後 i=2
子のインスタンス初期化子。i=3
子のコンストラクターが実行されています。i を 4 に設定
主に: 子供の i=4
主に: 親の i=1234