В Java является ли null существующим объектом в куче? - PullRequest
3 голосов
/ 25 сентября 2010

В Java null - существующий объект в куче?

Я пытаюсь понять разницу между неинициализированной локальной переменной (что не компилируется) и инициализированной нулем (что компилируется).

Ответы [ 5 ]

7 голосов
/ 25 сентября 2010

Смотрите здесь:

Java IAQ: Редко отвечаемые вопросы: Является ли NULL объектом?

3 голосов
/ 25 сентября 2010

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

  1. Точка останова невозможна;i не находится в области.
  2. i находится в области, но «не известна переменная в текущем контексте».
  3. Ссылка i была назначена, и онаимеет значение null.
  4. Ссылка i имеет значение 1, которое будет увеличиваться после строки 4.

Листинг:

Integer i;
i = null;
i = Integer.valueOf(1);
i++;

Приложение:

Итак, в чем разница между нулевым и неинициализированным?

До определенного присвоения , локальныйзначение переменной недоступно;любая попытка доступа к значению отклоняется во время компиляции.Как только определенное значение назначено, даже null, к этому значению можно получить доступ.Это критическая функция безопасности в Java.В некоторых языках неинициализированная переменная может ссылаться на значения в памяти, оставленной предыдущим процессом.

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

3 голосов
/ 25 сентября 2010

Или, чтобы избавить вас от щелчка, ответ - нет, это не объект. Нулевое значение означает, что ни на один объект не ссылаются.

0 голосов
/ 25 сентября 2010

Ноль НЕ является объектом. На самом деле это противоположность объекта, и поэтому вы не можете делать вызовы методов для ссылки, указывающей на ноль. Если вы действительно должны знать, что такое null, вы можете думать о нем как о чем-то вроде нуля. На самом деле ссылка, указывающая на ноль, больше не занимает памяти, т.е. нуль. У него нет значения, поэтому это ссылка, которая не относится ни к какому объекту.

В Java вы должны инициализировать переменную, прежде чем сможете ее использовать. По историческим причинам Java не хочет, чтобы вы принимали значения, поэтому компилятор заставляет вас присвоить ему значение. Одной из причин этого являются ошибки и проблемы с безопасностью, вызванные C, поскольку он не инициализировал значения и не заставлял вас делать это до того, как они были использованы. Java инициализирует некоторые значения для примитивов и переменных экземпляра: 0, 0.0, false, и null и т. Д., Но для локальных переменных вы должны дать ему значение. Это для вашей собственной защиты. : -)

0 голосов
/ 25 сентября 2010

локальная переменная, которая еще не была назначена, вероятно, также указывает на ноль. Я не эксперт по JVM, но это логичный выбор.

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

...