Class1
的属性类型为Class2
,名为pippo
:
public class Class1{
private Class2 pippo; //an attributo of Class1
.....
public Class2 getPippo()
{ return this.pippo;}
}
现在考虑一个格式正确的Class1
名为pluto
的实例,并考虑以下流程:
Class2 obj=pluto.getPippo();
// I apply some modification on obj
现在明确修改了obj
类型的实例Class1
。
问题:此类修改也适用于Class1 pluto
对象,这意味着obj
和pluto.pippo
因{{1}而具有相同的“生命”运营商?
答案 0 :(得分:6)
问题:此类修改是否也适用于
Class1 pluto
对象,
这个问题的答案是:问题本身就是一种误解。 : - )
pippo
和obj
是引用(指向)相同对象的变量。所以没有两个对象以某种方式链接,有一个对象,你有两个引用(指针)。
当然,如果您通过一个引用更改该对象的状态,则通过另一个引用可以看到该更新状态。
我们来看一个更简单的例子:
Thingy t1 = new Thingy();
这让我们记忆犹新:
+---------------+ +-----------------+ | t1 (variable) |----->| Thingy instance | +---------------+ +-----------------+ | field: value | | ... | +-----------------+
然后,如果我们这样做:
Thingy t2 = t1;
我们有:
+---------------+ | t1 (variable) |--+ +---------------+ | | | +-----------------+ +-->| Thingy instance | | +-----------------+ | | field: value | +---------------+ | | ... | | t2 (variable) |--+ +-----------------+ +---------------+
pippo
和obj
的情况完全相同。
答案 1 :(得分:2)
当您使用关键字new
创建对象时,需要很好地理解堆。此对象将在堆上创建,如果使用=符号将对象分配给另一个对象,则实际上将在堆上引用相同的对象。
Person person = new Person();
Person clone = person;
person.FirstName = "John";
clone.LastName = "Doe";
此代码仅在堆上创建一个对象,第一个名称为John和姓氏Doe。我想创建对象的副本,您需要查看.clone()
方法。
问题是,如果你做的事情与obj1 = obj2;
类似,那么就是。