Я сохранил копию объекта 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
даст вам «Абишек».
создавать объекты с новым ключевым словом, = передает ** ссылка ** этого объекта в переменную, равно var1 = var2 копирует ссылку ** не объект ** –