Stages of instance initialization are captured for example in this question. Nevertheless, it doesn't capture the moment when the instance variable get's declared and auto-initialized.
From my test code below I can see that instance variable int "i" of Child class is accessible even before the instance initializer of Child class was run. But when was this i variable declared and auto-initialized?
Code
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);
}
}
Output
Static Parent initialization
Static Child initialization
Parent's instance initializer running
print(): 'EXECUTED FROM PARENT'S INSTANCE INITIALIZER' ; i=0
update(1): After update i=1
Parent's constructor running
print(): 'EXECUTED FROM PARENT'S CONSTRUCTOR' ; i=1
update(2): After update i=2
Child's instance initializer; i=3
Child's constructor running. Setting i to 4
In main: child's i=4
In main: parent's i=1234