In previous articles, we already discussed about Java Constructor, Initialization blocks (both static & instance) and also their execution order
Read through below article to get hindsight into the topic
- Java constructor
- Initialization blocks in Java (static and init blocks)
- Constructors, Initialization blocks and their execution order
1. Execution order of Constructor and Initialization blocks:
Whenever a new instance is instantiated (or created), then their corresponding constructor and instance initialization blocks is executed as per below order;
- 1st instance initializer blocks get executed as per order defined in the class
- And then constructor
Now, let us focus on the next & main question i.e.; why the execution order of initialization blocks and constructor is pre-defined in Java
To understand this, we will execute a small demo program
Person.java
package in.bench.resources.execution.order.of.constructor.init.block;
public class Person {
// member variable
int personId;
String personName;
int personAge;
// default no-arg constructor
public Person() {
System.out.println("Default no-arg constructor");
}
// instance initializer block - 1
{
System.out.println("Init-block-1 : Intializing Person Id value to 1001");
personId = 1001;
}
// main() method
public static void main(String[] args) {
// instantiating a new object
Person person1 = new Person();
// invoking display() method
person1.display();
}
// instance initializer block - 2
{
System.out.println("Init-block-2 : Intializing Person Name value to Pup");
personName = "Pup";
}
// instance method to display person info
public void display() {
System.out.println("Person Info : " + this.personId + " - "
+ this.personName + " - " + this.personAge);
}
// instance initializer block - 3
{
System.out.println("Init-block-3 : Intializing Person Age value to 35");
personAge = 35;
}
}
Output:
Init-block-1 : Intializing Person Id value to 1001
Init-block-2 : Intializing Person Name value to Pup
Init-block-3 : Intializing Person Age value to 35
Default no-arg constructor
Person Info : 1001 - Pup - 35
Explanation:
- From above Person class execution, it is clear that all init-blocks got executed as per order from top-to-bottom and then constructor
- But all these blocks & constructor gets executed, due to object instantiation step inside main() method
- Without this step, no init-block or constructor gets executed
Q) Now, further why the executions order of all init-blocks executed first and then constructor ?
- Reason: after compilation, JVM puts or inserts all init-block statements inside constructor at the very beginning as per order (from top-to-bottom)
- To understand this, we need to de-compile the already compiled Person class (from its .class file)
De-compiled Person class:
/*
* Decompiled with CFR 0_118.
*/
package in.bench.resources.execution.order.of.constructor.init.block;
import java.io.PrintStream;
public class Person {
int personId;
String personName;
int personAge;
public Person() {
System.out.println("Init-block-1 : Intializing Person Id value to 1001");
this.personId = 1001;
System.out.println("Init-block-2 : Intializing Person Name value to Pup");
this.personName = "Pup";
System.out.println("Init-block-3 : Intializing Person Age value to 35");
this.personAge = 35;
System.out.println("Default no-arg constructor");
}
public static void main(String[] args) {
Person person1 = new Person();
person1.display();
}
public void display() {
System.out.println("Person Info : " + this.personId + " - "
+ this.personName + " - " + this.personAge);
}
}
Explanation:
- If you check the version of de-compiled Person class, then there aren’t any init-block present in the class
- And all init-block statements are inserted into constructor of the Person class
- It is inserted in a such a way that, all init-block statements comes first prior to any statements already present inside the constructor
Hope, it helps to understand better why the execution order of constructor & init-blocks is pre-defined
It’s time for you folks to reply back with your comments and suggestion
Happy Coding !!
Happy Learning !!