В чем разница между этим:разница между = и новый
Object one = new Object();
Object two = one;
и это:
Object one = new Object();
Object two = new Object();
two = one;
Что бы эффект на объекте one
при изменении объекта two
?
В чем разница между этим:разница между = и новый
Object one = new Object();
Object two = one;
и это:
Object one = new Object();
Object two = new Object();
two = one;
Что бы эффект на объекте one
при изменении объекта two
?
Первый фрагмент создает один объект и дает ему два «имени» (ссылки).
Второй фрагмент кода создает два объекта, но потом «забывает» второй, и заменяет его ссылкой на первый объект:
последняя диаграмма показывает второй объект без ссылок , На этом этапе объект становится пригодным для сбора мусора.
только для диаграммы ..... –
Спасибо @dasblinkenlight !!!! –
с помощью new
вы создаете новый объект, используя =
, вы просто назначаете ссылку на существующий объект.
Давайте сначала поймем, что именно означают эти утверждения.
Object one = new Object();
Здесь Object
тип one
является ссылочной переменной и new Object
фактически создает объект и его называют по one
.
Теперь, когда вы делаете two = one
, эталонная переменная two
также относится к тому же объекту, что и указанному one
. то есть теперь они оба будут ссылаться на один и тот же объект.
Ваш второй фрагмент неправильный. Вы не можете создать две контрольные переменные того же типа и того же имени. Вам придется изменить это.
Object two = new Object();
two = one;
Ну, эта ссылка немного не по теме, но это, безусловно, поможет вам понять, как именно ссылки на переменные ссылаются на объекты. http://www.thejavageek.com/2013/06/22/how-do-objects-become-eligible-for-garbage-collection/
Объект находится в куче, является разделяемым к любому коду, который имеет опорное значение, и OBJECT
содержит variable
значения членов, так что это не имеет значения, какой поток или метод изменяет данные в object
. Он изменен для всех.
Все переменные reference
относятся к тому же Object
.
Позволяет взять пример класса Rectangle.
Назначение объектов Ссылочные переменные -
1. Не создавать отдельные объекты.
2. Не выделяет память
3. Не Создать дубликат
Object one = new Object();
Object two = one;
Здесь вы создали один объект и есть две ссылки на этот же объект.
Object one = new Object();
Object two = new Object();
two = one;
Здесь создан два объекта, но позже назначен один из переменных с другими объектами, так что вы опять две ссылки на тот же объект, но создал дополнительный объект, который теперь будет garbage collected
.
Подумайте о предметах как о коробках и переменных в виде стрелок, указывающих на эти поля.
Итак, когда вы делаете
Object one = new Object();
вы создаете новую коробку и новую стрелку, указывающую на поле.
В то время, когда вы
Object two = one;
вы просто создаете новую стрелку и указывая его в существующую коробку.
Мне нужны эти любопытные объяснения. Thumbs up –
Когда вы делаете новый, jvm выделяет некоторую память этому объекту, когда вы используете «=», он дает ссылку на ту же память на переменную с левой стороны.
Значит, если вы делаете,
Object x=new Object();
Object x1=x;
теперь оба будут указывать на тот же обращение к памяти, и вы можете получить доступ, что распределение памяти, как это имя, х и х1.
Спасибо kaushal trivedi. Ваш ответ правильный, но «selig» ответил первым. Еще +1 для вас тоже. –
Thats ok для меня, участие в самом сообществе - замечательная вещь. Здесь нет ничего подобного конкуренции. –
Причина: Мне нравится ваш ответ, что я понял это, вы объяснили мне очень простым способом. Еще раз спасибо –
Эффект будет таким же.
Поскольку оба ссылочного типа, если вы:
объект два = один;
Затем оба относятся к одной и той же ячейке памяти, а изменения в одном влияют на другую.
Единственное отличие между двумя методами состоит в том, что в методе 2 вы создаете 2 экземпляра из 2-х разных объектов, но после object two = one;
они будут тем же самым объектом.
Попробуйте сами и посмотрите, что произойдет. – moonwave99
У вашего второго фрагмента в настоящее время есть ошибка компилятора. –
Ваш второй пример не компилируется, вы не можете снова создать ссылку 'two'. Возможно, вместо 'object two = one;' вы имели в виду 'two = one'? – Pshemo