Ответ 1
- (члены-переменные) инициализируются на
null
(или по умолчанию для примитива, если они являются примитивами) - локальные переменные не инициализируются, и вы несете ответственность за установку начального значения.
У меня есть этот код:
MyClass object;
.... some code here where object may or may not be initialised...
if (object.getId > 0) {
....
}
Это приводит к ошибке компиляции: object
, возможно, не был инициализирован, что справедливо.
Теперь я меняю свой код на это:
MyClass object;
.... some conditional code here where object may or may not be initialised...
if (object != null && object.getId > 0) {
....
}
Я получаю ту же ошибку компиляции! Мне нужно инициализировать object
до нуля:
MyClass object = null;
Итак, какая разница между не инициализацией объекта и инициализацией до нуля? Если я объявляю объект без инициализации, то он не равен нулю?
Спасибо
null
(или по умолчанию для примитива, если они являются примитивами)Это вещь определения языка.
Язык заявляет, что переменные области METHOD ДОЛЖНЫ быть инициализированы вручную - если вы хотите, чтобы они начинались с NULL, вы должны явно сказать это - если вы этого не сделаете, они в основном находятся в undefined состояние.
В противоположность этому, язык указывает, что переменные класса CLASS не нужно инициализировать вручную - неспособность инициализировать их приводит к тому, что они автоматически получают инициализацию до NULL, поэтому вам не нужно беспокоиться об этом.
Что касается разницы между двумя состояниями (null vs. undefined), да, они в основном одинаковы, но язык требует, чтобы вам нужно инициализировать переменную (независимо от того, сделано это автоматически или нет, в зависимости от области переменных).
Ваше объявление объекта действительно является объявлением указателя или ссылки на экземпляр MyClass в куче. Если вы не инициализируете указатель, вы по существу получаете указатель, указывающий на случайное. По объяснению инициализации указателя на NULL вы указываете, что он указывает на NULL-адрес, который знает компилятор, недействительный.
Дополнительная путаница вводится в Java, потому что она неявно инициализирует переменные-члены для NULL для вас.
Это немного лучше, если вы использовали языки нижнего уровня, такие как С++.