When does the instance variable get initialized? Is it after the constructor block is done or before it?
Consider this example:
public abstract class Parent {
public Parent(){
System.out.println("Parent Constructor");
init();
}
public void init(){
System.out.println("parent Init()");
}
}
public class Child extends Parent {
private Integer attribute1;
private Integer attribute2 = null;
public Child(){
super();
System.out.println("Child Constructor");
}
public void init(){
System.out.println("Child init()");
super.init();
attribute1 = new Integer(100);
attribute2 = new Integer(200);
}
public void print(){
System.out.println("attribute 1 : " +attribute1);
System.out.println("attribute 2 : " +attribute2);
}
}
public class Tester {
public static void main(String[] args) {
Parent c = new Child();
((Child)c).print();
}
}
OUTPUT:
Parent Constructor
Child init()
parent Init()
Child Constructor
attribute 1 : 100
attribute 2 : null
-
When are the memory for the atribute 1 & 2 allocated in the heap ?
-
Curious to know why is attribute 2 is NULL ?
-
Are there any design flaws?
The memory for the object as a whole is allocated when the
newoperator is invoked, before thejava.lang.Objectconstructor is entered. Memory is allocated for individualIntegerinstances ininit, but there is no point when memory is allocated for individual properties — only whole objects.The
initmethod is called in the super constructor, soattribute2is assignednew Integer(200), and then the subclass constructor is invoked which applies property initializers in the order they appear in the source code. This lineoverwrites the value assigned by
init()tonull.If you add a call to
right after your call to
super();then this will become apparent.Calling sub-class methods before the base class has finished initializing is dangerous. The sub-class might rely on its base-class’s invariants to protect its own invariants, and if the base-class constructor has not completed, then its invariants may not hold.
This is also likely to confuse C++ programmers and the like who would expect a call to
initfrom the base class to invoke the base class’s version since C++ rewrites the vtable pointer as constructors are entered.See The Java Language Specification for all the gory details.