Нужно ли двум объектам иметь одинаковый адрес памяти, чтобы указывать на одну и ту же вещь в Java? - PullRequest
1 голос
/ 21 сентября 2019

Когда вы создаете два объекта в Java, что происходит, когда вы устанавливаете один из них равным другому.Какая часть этого объекта изменяется, когда мы устанавливаем его равным другому.Изменяется ли адрес памяти, который хранится в стеке, или они оба начинают указывать на одну и ту же вещь в памяти кучи без изменения адреса памяти, хранящегося в стеке?

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

например, Test t1 = new Test ();

Test t2 = new Test ();

t2 =t1;

Это утверждение "t2 = t1" действительно изменит какую часть t2?

Ответы [ 3 ]

1 голос
/ 21 сентября 2019
Test t1= new Test();

Эта строка создает новый объект Test и присваивает его t1

Test t2= new Test();

Эта строка создает дополнительный объект Test и присваивает его t2

t2=t1;

Этот аналог назначает объект, который был присвоен t1, а также t2.Исходный объект t2 теперь потерян и будет уничтожен при следующем запуске сборщика мусора.

This statement "t2=t1" is going to change actually what part of t2?

Думайте о t2 как о указателе.до этого ряда он указывал на один объект, теперь он указывает на другой.внутренняя часть этих двух объектов не изменяется этой строкой, только указатель.

0 голосов
/ 22 сентября 2019

Мой совет - забыть о таких вещах, как «адрес памяти» и «стек».Это не те понятия, которые вам нужны для программирования на 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;в этом примере ничто не ссылается на этот второй объект, поэтому он недоступен и должен оставаться таким (потому что единственный способ получить к нему доступ через ссылку, которой у нас больше нет).

Чтобы подчеркнуть точку: назначение ссылокне изменяет сами объекты.

Мы ни разу не упоминали здесь адреса памяти.

0 голосов
/ 21 сентября 2019

Когда вы создаете два объекта в Java, что происходит, когда вы назначаете один равный другому

, что не имеет смысла - вы не назначаете объект другому объекту

Есть две простые вещи - указатель (фактически ссылка) на объект в памяти и этот объект в памяти.Вы не назначаете объекты один другому, вы назначаете место в памяти указателю.Поэтому у вас будет 2 указателя, указывающих на одну и ту же область памяти + фантомный объект для сбора мусора

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