Подтвердить что ты не робот

Какая разница между неинициализацией и инициализацией до нуля?

У меня есть этот код:

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;

Итак, какая разница между не инициализацией объекта и инициализацией до нуля? Если я объявляю объект без инициализации, то он не равен нулю?

Спасибо

4b9b3361

Ответ 1

  • (члены-переменные) инициализируются на null (или по умолчанию для примитива, если они являются примитивами)
  • локальные переменные не инициализируются, и вы несете ответственность за установку начального значения.

Ответ 2

Это вещь определения языка.

Язык заявляет, что переменные области METHOD ДОЛЖНЫ быть инициализированы вручную - если вы хотите, чтобы они начинались с NULL, вы должны явно сказать это - если вы этого не сделаете, они в основном находятся в undefined состояние.

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

Что касается разницы между двумя состояниями (null vs. undefined), да, они в основном одинаковы, но язык требует, чтобы вам нужно инициализировать переменную (независимо от того, сделано это автоматически или нет, в зависимости от области переменных).

Ответ 3

Ваше объявление объекта действительно является объявлением указателя или ссылки на экземпляр MyClass в куче. Если вы не инициализируете указатель, вы по существу получаете указатель, указывающий на случайное. По объяснению инициализации указателя на NULL вы указываете, что он указывает на NULL-адрес, который знает компилятор, недействительный.

Дополнительная путаница вводится в Java, потому что она неявно инициализирует переменные-члены для NULL для вас.

Это немного лучше, если вы использовали языки нижнего уровня, такие как С++.