0

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

1 Answers1

0

Paraphrasing java docs "Example 12.5-1. Evaluation of Instance Creation" in a context of the example here:

"First a new instance of Child is created. Space is allocated for the new Child object, to hold all the fields of its class and of its parental classes recursively (Parent, Object). All these fields then get initialized to its default values (in this case 0s). Next, the Child constructor is invoked. This constructor then invokes its parent constructor, recursively. Next, any instance initializers and instance variable initializers of Object are invoked. Next, the body of the constructor of Object that takes no arguments is executed..."

(Read the full javaDocs example in the link provided, if interested.)