Many articles say objects get created only after the class’s constructor gets called. But I found this snippet and it works fine.
public class A {
public A(){
this.foo();//line #1
}
private void foo() {
System.out.print("without an instance..!!!!");
}
}
class B extends A
{
public static void main(String[] args){
A a = new A(); //line #2
}
}
Here you see, I’m trying to create an object of its super class in line #2 and in its constructor how come its method got called without an instance. What’s going on here, is Constructer of instance of A is getting called here.?
The constructor is always called when an object is created. Even if you don’t explicitly define a constructor, the compiler will generate one for you with an empty body.
You may call other methods of the class from the constructor. All non-static methods get an implicit (compiler generated) parameter to
this, the actual class instance. However, it is important to know that while executing the constructor, the object is not yet fully created, although all data members of the class in question (if there are such) have already been initialized, at least to some default value. Because of this, youthis(i.e. pass it to other objects / threads) before exiting the constructor call, andfinal, non-privatemethods from the constructor.Doing either of these (in a non-
finalclass) means that you give access to an object not yet fully constructed, which may result in subtle, hard to find bugs later. E.g. if the virtual method in question is overridden in a subclass and the implementation depends on some member defined and initialized only in the subclass constructor, the method gets called before the subclass member is correctly initialized, thus it won’t have the value you would expect.