Мой совет - забыть о таких вещах, как «адрес памяти» и «стек».Это не те понятия, которые вам нужны для программирования на Java.
Понятия, которые вам нужны - это «объект» и «ссылка».
Выражение типа new Test()
создает объект класса Test.Результатом выражения является ссылка на объект.
Переменная - это (исключая типы примитивов, такие как int, double и т. Д.) Слот, который содержит ссылку, или null
, который вообще не является ссылкой.Объявление типа Test t1
говорит, что переменная с именем t1 может содержать ссылку на объект класса Test.
t1 не объект, это ссылка.Объект не называется t1, переменная, которая (в данный момент) ссылается на него, называется t1.(Хотя нам будет разрешено свободно говорить «объект t1», потому что другого имени для этого объекта нет.)
Назначение / инициализация (мы можем рассматривать их как эквивалентные здесь) сохраняет значение выражения насправа в переменную слева.
Собрав все это вместе, Test t1 = new Test()
объявляет переменную с именем t1, которая может содержать ссылку на объект Test;Тестовый объект создан;ссылка на этот тестовый объект сохраняется в t1.Обратите внимание, что t1 не является объектом;t1 ссылается на объект.
Аналогично, конечно, Test t2 = new Test()
объявляет переменную с именем T2, которая получает ссылку на другой объект Test.
Теперь мы выполняем t2 = t1
- содержимоеt2 заменяется содержимым t1.Другими словами, t2 и t1 имеют одинаковое значение, и это значение оказывается ссылкой на первый объект Test, который был создан.Естественно, t2 теперь не имеет ссылки на второй объект Test;в этом примере ничто не ссылается на этот второй объект, поэтому он недоступен и должен оставаться таким (потому что единственный способ получить к нему доступ через ссылку, которой у нас больше нет).
Чтобы подчеркнуть точку: назначение ссылокне изменяет сами объекты.
Мы ни разу не упоминали здесь адреса памяти.