Конструктор по умолчанию не инициализирует члены экземпляра класса?
Я столкнулся с вопросом, который спрашивает
"Какое из следующего верно для конструктора" 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
Спасибо