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

SERich picture SERich · Jul 27, 2016 · Viewed 17.8k times · Source

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 ?

Answer

smac89 picture smac89 · Jul 27, 2016

The class constructor is not the one doing the initialization, the JVM does this.

After memory for the object is created, 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