I encountered a question that asks "Which of the following are true about the "default" constructor?"
and an option "It initializes the instance members of the class." was incorrect choice.
Now my understanding was that if we have a code such as
Class Test {
String name;
}
then the compiler creates default constructor that looks like
Class Test {
String name;
Test(){
super();
name = null;
}
}
Isn't the default constructor initializing the instance member name=null ?
Default constructors are one of the special member functions. If no constructors are declared in a class, the compiler provides an implicit inline default constructor. If you rely on an implicit default constructor, be sure to initialize members in the class definition, as shown in the previous example.
The default constructor does not initialize members of your class.
The default constructor initializes any uninitialized instance variables with default values.
In a case where there are no instance variables what does the default constructor initialize? Ans. Java expects the superclass ( Object Class ) constructor to be called while creation of any object. So super constructor is called in case there are no instance variables to initialize.
The class constructor is not the one doing the initialization, the JVM does this.
After memory for the object is allocated, the members of the object are default initialized to some predictable value, which becomes their default value. This is all done before the constructor is called!
According to the specification
- Each class variable, instance variable, or array component is initialized with a default value when it is created (§15.9, §15.10.2):
- For type byte, the default value is zero, that is, the value of
(byte)0
.
(short)0
.0
.0L
.0.0f
.0.0d
.'\u0000'
.false
.null
.Your assumption is close but the fact is, before the constructor parameters are even evaluated, before it can even assign a value to each of the fields - those fields already hold their default values, and this is done by the JVM.
Read subsection §15.9.4 to understand how the initialization process is carried out
In Java fields are initialized before the constructor. This can be easily proved by the following code:
public class MyClass {
int myField = initMyField();
MyClass(){
System.out.println("ctor");
}
static int initMyField() {
System.out.println("init field");
return 1;
}
}
output
init field
ctor
You can also check the de-compiled code.
Isn't the default constructor initializing the instance member
name = null
?
No, constructors get called after all instance variables are initialized by the default values: 0
or the equivalent value for primitive numerical types, false
for the boolean
type, null
for reference types.
No, it is not the default constructor which initialize the instance variables for you. Each type has a default value. The moment you created the object, the default value is used.
So if you do not explicitly initialize the instance variables, they will be still using the default values defined for them implicitly.
i.e. 0 for int, null for reference type.. etc
However, it is worth noting that we should not take it for granted that a default value is given, and choose not to initialize the variables.
You may try defining an empty constructor which override the default constructor with empty implementation. You will realize all instance variables will still be initialized.
It does. Although the question is based more on usage.
public class Main {
String x;
Main() {
x = "Init";
}
@Override
public String toString() {
return x;
}
public static void main(String[] args) {
System.out.println(new Main());
}
}
Ouput:
Init
Whenever we are executing a java class, first Static Control Flow will be executed. In the Static Control Flow if we are creating an object then the following steps will be executed(in the mentioned order) as a part of Inatance Control Flow:
So, in your above code the instance variable "name" is already assigned to null(default value for reference types) even before the constuctor is executed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With