Мне было интересно, что происходит на уровне памяти, когда объект определен, но не инициализирован.
Предположим, что мы говорим о Java здесь.
Сначала я должен исправить ваше неверное описание. (По причинам, которые станут очевидными ...)
Это не определение объекта . Скорее, объявляет переменную . Идентификатор foo
обозначает переменную . Поскольку тип переменной (в данном случае) Object
, который является ссылочным типом, переменная может содержать либо ссылку на объект Java , либо null
.
Указывает ли foo
на область памяти?
Ответ немного сложен.
Если переменная инициализирована, она либо будет указывать на некоторый объект, либо будет содержать null
.
Если переменная НЕ инициализирована, то это зависит от типа переменной, о которой мы говорим:
Для поля класса (статического или экземпляра) переменная, которая не инициализирована явно, имеет значение Инициализировано по умолчанию * null
.
Для переменной, которая является параметром или переменной catch, семантика языка Java гарантирует, что переменная всегда инициализируется ... так что это спорный вопрос.
Для локальной переменной JLS не говорит, что она содержит, прежде чем ей будет присвоено значение. Вы могли бы сказать, что значение является неопределенным. Однако JLS (и во время выполнения, верификатор файла классов JVM) гарантируют, что программа не может использовать локальную переменную, которая находится в неопределенном состоянии. (Это ошибка компиляции в коде Java для чтения переменной, которая не была определенно назначена .) Так что действительно не имеет значения, что содержит переменная на самом деле .
Обратите внимание, что в чистой Java переменная никогда не может содержать значение, которое не было установлено присваиванием или инициализацией. Таким образом, переменная никогда не может ссылаться на случайный адрес памяти. (Если вы используете нативный код, возможно, что код повредит переменную, чтобы что-то содержать. Но не делайте этого преднамеренно, так как это может привести к серьезному сбою JVM.)
Меняется ли это поведение между различными языками программирования?
Э-э-э ... да. Например, в C и C ++ программа может использовать значение переменной-указателя, которая не была инициализирована. Поведение, которое следует, является неопределенным .