2013-07-12 2 views
3
public class TestVO { 

    public static void main(String[] args) { 
     VO vo1 = new VO(); 
     VO vo2 = new VO(); 
     VO vo3; 
     VO vo4 = new VO(); 

     vo1.setName("Sourav"); 
     vo2.setName("Anil"); 

     vo3 = vo1; 
     vo4 = vo1; 

     System.out.println(" " + vo4.getName()); 

     vo1.setName("Abhishek."); 

     System.out.println(vo1.getName() + " " + vo2.getName() + " " + vo3.getName() + " " + vo4.getName()); 
    } 
} 

--output является: ---Разница между объектом и ссылкой в ​​java с кодом?

Sourav 

Abhishek. Anil Abhishek. Abhishek. 

VO простой класс содержит имя Строка и содержат геттер и сеттер.

В первом System.out.println * vo4.getName() * печать: штраф Sourav ok.It в.

Но во 2-й System.out.println * vo4.getName() * печать: Абхишек.

Мой вопрос, почему 2-й отпечаток Abhishek.. Я сохранил копию vo1-объекта в объекте vo4, а не ссылку. Это означает, что он создает новую память. vo1 и vo4 различаются. Тогда почему vo4.getName изменяется во второй раз. Я устанавливаю объект vo1, но vo4 автоматически изменяется. Почему это происходит?

+1

создавать объекты с новым ключевым словом, = передает ** ссылка ** этого объекта в переменную, равно var1 = var2 копирует ссылку ** не объект ** –

ответ

6

Поскольку оба vo1 и vo4 относятся к одному и тому же объекту.

Ниже присвоение vo4 относится к объекту, на который ссылается vo1.

vo4 = vo1; 

И, следовательно, любые изменения, сделанные в виду объект любым из ссылки (будь то VO1 или VO4) будет соответствовать одному и тому же объекту.

Таким образом, если вы измените слово vo4.setName ("xyz"), его будет менять объект, который передается vo4, но на самом деле vo1 также относится к одному и тому же объекту. Таким образом, изменения производятся в одном месте памяти, выделенном для ОДНОГО объекта, который ОБРАТРЕННЫЙ многими ссылками (в данном случае vo1 и vo4).

24

Я сохранил копию объекта vo1 в объекте vo4, а не ссылку.

Нет, вы указали переменные vo1 и vo4 в то же объекта, например:

+-----+ 
| vo1 |--------\ 
+-----+   \ +----------------+ 
       --->| (object)  | 
+-----+  / | name = Abishek | 
| vo4 |--------/  +----------------+ 
+-----+

Давайте проследим код через:

VO vo1 = new VO(); 

дает нам:

+-----+    +----------------+ 
| vo1 |------------->| (object)  | 
+-----+    | name = null | 
        +----------------+

Тогда:

VO vo2 = new VO(); 

Теперь мы имеем:

+-----+    +----------------+ 
| vo1 |------------->| (object)  | 
+-----+    | name = null | 
        +----------------+ 

+-----+    +----------------+ 
| vo2 |------------->| (object)  | 
+-----+    | name = null | 
        +----------------+

Тогда:

VO vo3; 

... который просто создает vo3 с null (не указывая на какой-либо объект).

Тогда:

VO vo4 = new VO(); 

Итак, мы имеем:

+-----+    +----------------+ 
| vo1 |------------->| (object)  | 
+-----+    | name = null | 
        +----------------+ 

+-----+    +----------------+ 
| vo2 |------------->| (object)  | 
+-----+    | name = null | 
        +----------------+ 
+-----+ 
| vo3 | (is null) 
+-----+ 

+-----+    +----------------+ 
| vo4 |------------->| (object)  | 
+-----+    | name = null | 
        +----------------+

Сейчас:

vo1.setName("Sourav"); 
vo2.setName("Anil"); 

дает нам:

+-----+    +----------------+ 
| vo1 |------------->| (object)  | 
+-----+    | name = Sourav |  *** change is here *** 
        +----------------+ 

+-----+    +----------------+ 
| vo2 |------------->| (object)  | 
+-----+    | name = Anil |  *** and here *** 
        +----------------+ 
+-----+ 
| vo3 | (is null) 
+-----+ 

+-----+    +----------------+ 
| vo4 |------------->| (object)  | 
+-----+    | name = null | 
        +----------------+

Вот где самое интересное:

vo3 = vo1; 
vo4 = vo1; 

Это указывает vo3 на тот же объект vo1 указывает на, и указывает vo4 на этом объекте, а также, отпуская объект vo4 используется, чтобы указать (который получает право на мусор коллекция). Давая нам:

+-----+ 
| vo1 |----\ 
+-----+  \ 
      \ 
+-----+  \  +----------------+ 
| vo3 |------------->| (object)  | 
+-----+  / | name = Sourav | 
      /  +----------------+ 
+-----+ /
| vo4 |----/ 
+-----+ 

+-----+    +----------------+ 
| vo2 |------------->| (object)  | 
+-----+    | name = Anil | 
        +----------------+

Теперь

System.out.println(" " + vo4.getName()); 

... дает нам "Sourav", как можно было ожидать.

Тогда

vo1.setName("Abhishek."); 

... изменяет объект, который vo1, vo3 и vo4 все указывая на:

+-----+ 
| vo1 |----\ 
+-----+  \ 
      \ 
+-----+  \  +----------------+ 
| vo3 |------------->| (object)  | 
+-----+  / | name = Abishek | 
      /  +----------------+ 
+-----+ /
| vo4 |----/ 
+-----+ 

+-----+    +----------------+ 
| vo2 |------------->| (object)  | 
+-----+    | name = Anil | 
        +----------------+

... и так getName() на vo1, vo3 или vo4 даст вам «Абишек».

+6

Nice ascii art! –

+0

upvote за то, что он очень быстро –

+1

@GrahamSmith: Любите меня ASCII-арт. Я, вероятно, должен был использовать http://yuml.me/. :-) –

2

Вы задаете тот же объект ссылка на vo1 и vo4.

vo4 = vo1; 

Теперь обе ссылочные переменные указывают на один и тот же объект.

enter image description here

0

когда вы делаете vo4 = vo1; вы просто скопировать vo1 на Другой крупный в vo4, в других терминах вы делаете назначение указателя, так они оба назначить на то же место в памяти, что приводит, если vo1 изменяет это также повлияет на vo4 тоже, так как в результате вы видите

0

Все в java, за исключением основных типов данных, является указателем. После создания vo4 вы установили его равным vo1. Сейчас vo4 указывает на v01.

0

Когда вы делаете vo4 = vo1, это означает, что эталонная переменная vo4 имеет отношение к объекту, указанному vo1. Таким образом, оба vo1 и vo4 будут ссылаться на тот же объект

Прочитайте первую часть этого урока. Вам не нужно идти до конца, так как речь идет о сборке мусора, но в деталях подробно объясняется, как привязки объектов к объектам и как они запираются.

http://www.thejavageek.com/2013/06/22/how-do-objects-become-eligible-for-garbage-collection/

1

объект является объектом, который будет хранить фактическое значение для полей, определенных в it.Object будут получать созданные на память, используя ключевое слово new и ссылки будут возвращены ссылки на переменную variable.Reference не является объектом. Итак, в вашем примере new VO() создаст объект в куче памяти, а VO1 будет иметь ссылку на него.

0

Я должен подготовить следующую картину: как вы видите vo1, Vo3, VO4 указывают на тот же объект

enter image description here

+0

Простейшая диаграмма для понимания. –

+0

@ABasak: кроме ярлыков назад. Переменные находятся в стеке, а не в куче; объекты находятся в куче, а не в стеке. –

+0

@ T.J. Кроудер: Большое спасибо за ваш комментарий, я исправил эту ошибку –