Конструктор по умолчанию не инициализирует члены экземпляра класса?

Я столкнулся с вопросом, который спрашивает "Какое из следующего верно для конструктора" default "?"

и параметр "Он инициализирует членов экземпляра класса". был неправильным выбором.

Теперь я понял, что если у нас есть код, например

    Class Test {
        String name;
    }

тогда компилятор создает конструктор по умолчанию, который выглядит как

    Class Test {
        String name;
        Test(){
            super();
            name = null;
        }
    }

Не является конструктором по умолчанию, инициализирующим имя члена экземпляра = null?

Ответы

Ответ 1

Конструктор классов не тот, который выполняет инициализацию, JVM делает это. После создания памяти для объекта члены объекта по умолчанию инициализируются некоторым предсказуемым значением, которое становится их значением по умолчанию.

В соответствии с спецификацией

  • Каждая переменная класса, переменная экземпляра или компонент массива инициализируется значением по умолчанию при его создании (§15.9, §15.10.2):
    • Для байта типа значение по умолчанию равно нулю, то есть значение (byte)0.
    • Для типа short значение по умолчанию равно нулю, то есть значение (short)0.
    • Для типа int значение по умолчанию равно нулю, то есть 0.
    • Для типа long значение по умолчанию равно нулю, то есть 0L.
    • Для типа float значением по умолчанию является положительный ноль, то есть 0.0f.
    • Для типа double значение по умолчанию равно положительному нулю, то есть 0.0d.
    • Для типа char значением по умолчанию является нулевой символ, то есть '\u0000'.
    • Для типа boolean значение по умолчанию false.
    • Для всех ссылочных типов (§4.3) значение по умолчанию null.

Ваше предположение близко, но факт заключается в том, что до того, как параметры конструктора будут даже оценены, - прежде чем он сможет даже присвоить значение каждому из полей - эти поля уже имеют значения по умолчанию, и это выполняется с помощью JVM.

Прочтите подраздел §15.9.4, чтобы понять, как выполняется процесс инициализации

Ответ 2

В полях Java инициализируется конструктор до. Это легко доказать с помощью следующего кода:

public class MyClass {

    int myField = initMyField();

    MyClass(){
        System.out.println("ctor");
    }

    static int initMyField() {
        System.out.println("init field");
        return 1;
    }
}

Выход

init field
ctor

Вы также можете проверить декомпилированный код.

Ответ 3

Не является конструктором по умолчанию, инициализирующим член экземпляра name = null?

Нет, конструкторы вызываются после того, как все переменные экземпляра инициализируются значениями по умолчанию: 0 или эквивалентное значение для примитивных числовых типов, false для типа boolean, null для ссылочных типов.

Ответ 4

Нет, это не стандартный конструктор, который инициализирует переменные экземпляра для вас. Каждый тип имеет значение по умолчанию. В тот момент, когда вы создали объект, используется значение по умолчанию.

Итак, если вы явно не инициализируете переменные экземпляра, они будут по-прежнему использовать значения по умолчанию, определенные для них неявно.

то есть. 0 для int, null для ссылочного типа.. etc

Однако стоит отметить, что мы не должны считать само собой разумеющимся, что задано значение по умолчанию, и не следует инициализировать переменные.


Вы можете попытаться определить пустой конструктор, который переопределяет конструктор по умолчанию с пустой реализацией. Вы поймете, что все переменные экземпляра все еще будут инициализированы.

Ответ 5

Это так. Хотя вопрос основан скорее на использовании.

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

Ответ 6

Конструктор по умолчанию предоставляет значения по умолчанию для объекта (ов) и обычно создается компилятором, когда конструктор явно не определен. например.

class DefaultTest{  
int id;  
String name;  

void display(){System.out.println(id+" "+name);}  

public static void main(String args[]){  
DefaultTest s1=new DefaultTest();  
DefaultTest s2=new DefaultTest();  
s1.display();  
s2.display();  
}  
}  

NB: при отсутствии конструктора компилятор будет генерировать конструктор по умолчанию, который присваивает 0 пустым значениям для двух объектов.

Ответ 7

Всякий раз, когда мы выполняем класс java, выполняется первый статический поток управления. В Static Control Flow, если мы создаем объект, будут выполнены следующие шаги (в указанном порядке) в составе потока управления Inatance:

  • Идентификация членов экземпляра (экземплярная переменная и блоки экземпляров) сверху вниз.
  • Выполнение присвоений переменных экземпляра и блоков экземпляра.
  • Выполнение конструктора.

Итак, в приведенном выше коде переменная экземпляра "имя" уже назначена нулевому значению (значение по умолчанию для ссылочных типов) даже до того, как будет выполнен constuctor.

Ответ 8

Нет, он не инициализирует не-примитивную переменную экземпляра. Только примитивный получает инициализацию со значением по умолчанию

то есть.

Integer nonPrim;
int prim;

то после создания объекта nonPrim == null; prim == 0

Спасибо