В чем разница между неинициализацией и инициализацией в null? - PullRequest
18 голосов
/ 10 ноября 2010

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

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? Если я объявляю объект без инициализации, разве это не равно нулю?

Спасибо

Ответы [ 3 ]

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

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

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

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

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

0 голосов
/ 10 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...