Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Default constructor does not initialize the instance members of the class?

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 ?

like image 984
SERich Avatar asked Jul 27 '16 05:07

SERich


People also ask

Does default constructor initialize members?

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.

Which constructor does not initialize any data members?

The default constructor does not initialize members of your class.

Does default constructor initialize Java?

The default constructor initializes any uninitialized instance variables with default values.

What does the default constructor initialize if there are no instance variables?

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.


6 Answers

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.
  • For type short, the default value is zero, that is, the value of (short)0.
  • For type int, the default value is zero, that is, 0.
  • For type long, the default value is zero, that is, 0L.
  • For type float, the default value is positive zero, that is, 0.0f.
  • For type double, the default value is positive zero, that is, 0.0d.
  • For type char, the default value is the null character, that is, '\u0000'.
  • For type boolean, the default value is false.
  • For all reference types (§4.3), the default value is 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

like image 116
smac89 Avatar answered Oct 06 '22 00:10

smac89


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.

like image 32
Cheng Chen Avatar answered Oct 06 '22 00:10

Cheng Chen


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.

like image 42
Andrew Tobilko Avatar answered Oct 06 '22 01:10

Andrew Tobilko


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.

like image 43
user3437460 Avatar answered Oct 06 '22 00:10

user3437460


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
like image 25
RCInd Avatar answered Oct 06 '22 01:10

RCInd


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:

  1. Identification of instance members(instance variable and instance blocks) from top to bottom.
  2. Execution of instance variable assignments and instance blocks.
  3. Execution of constructor.

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.

like image 43
Rajdeep Sarkar Avatar answered Oct 06 '22 00:10

Rajdeep Sarkar