Запрос на ссылки в Java - PullRequest
0 голосов
/ 31 июля 2010

Рассмотрим следующий пример наследования:

class A {...}  
class B extends A  
{  
 ..  
 ..  
 private static void main(String[] s)  
 {  
    A a1 = new A();  
    B b1 = new B();  
    B b2 = b1;             // What if it was B b2 = new B(); b2 = b1;  
 }
}

Мой вопрос в комментарии.Будет ли это иначе, в том смысле, что использование оператора new создаст новое пространство для объекта b2, а b2=b1 просто скопирует данные b1 в b2.Таким образом, любые изменения, внесенные в один объект, не повлияют на другой.В основном встроенном коде B b2 = b1 будет указывать b2 на пространство, выделенное для b1.Таким образом, любые изменения могут повлиять как на данные объекта.

Мой запрос, будет ли использование оператора new иметь какое-либо значение для манипулирования объектом?

Ответы [ 3 ]

9 голосов
/ 31 июля 2010
B b1 = new B();
B b2 = b1;

Выше кода создает только один объект типа B. b1 и b2 являются ссылками, которые указывают на тот же объект. Это псевдонимы для одного и того же объекта.

B b1 = new B(); //1
B b2 = new B(); //2
b2 = b1;        //3

В этом коде два объекта типа B создаются в строках 1 и 2. Однако после строки 3 b2 ссылается на тот же объект , что и b1 , и поэтому оба снова являются псевдонимами. Объект, на который изначально ссылается b2, теперь получает право на сборку мусора.

Итак, в обоих случаях b1 и b2 указывают на один и тот же объект, и любые изменения, сделанные в этом объекте, будут видны через обе ссылки. Имейте в виду, что b1 и b2 не являются самим объектом, а являются только ссылками на этот объект. b1 = b2 не копирует какие-либо значения из одного объекта в другой, он просто повторно ссылается на ссылку.

2 голосов
/ 31 июля 2010
B b1 = new B()

создает новый объект и присваивает ему ссылку, b1.

B b2 = b1

создает новую ссылку и устанавливает ее равной b1, которая является ссылкой.

Нет "скопировать данные b1 в b2". Две ссылки теперь указывают на один и тот же базовый объект.

2 голосов
/ 31 июля 2010

Это делает объект A и объект B. Есть две ссылки на объект B.

A a1 = new A();
B b1 = new B();
B b2 = b1;

Это делает объект A и два объекта B. Есть две ссылки на первый объект B. Второй объект B больше не имеет ссылки на него и будет доступен для сборки мусора.

A a1 = new A();
B b1 = new B();
B b2 = new B();
B b2 = b1;

B b2 = b1; На этом шаге не копируются никакие данные объекта. Оба b2 и b1 будут указывать на один и тот же объект. Так что это не будет иметь значения, которое вы используете для установки или получения данных.

B b2 = new B();
B b2 = b1;
b2.setValue("Foo");
b1.getValue(); // would return "Foo"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...