Class1
有一个类型为Class2
的属性,命名为pippo
:
public class Class1{
private Class2 pippo; //an attributo of Class1
.....
public Class2 getPippo()
{ return this.pippo;}
}
现在考虑一个名为pluto
的Class1
的良好形式实例,并考虑以下流程:
Class2 obj=pluto.getPippo();
// I apply some modification on obj
现在Class1
类型的实例obj
明显被修改了。
问题:这样的修改是否也适用于Class1 pluto
对象,这意味着obj
和pluto.pippo
是否由于=
操作符而具有相同的"生命"?
问题:这样的修改是否也适用于
Class1 pluto
对象,
这个问题的答案是:这个问题本身就是一个误解。: -)
pippo
和obj
都是指向相同的对象的变量。所以没有两个对象以某种方式链接,只有一个对象有两个引用(指针)指向
因此,如果你通过一个引用改变了对象的状态,那么更新后的状态在另一个引用中是可见的。
让我们看一个简单的例子:
Thingy t1 = new Thingy();
在内存中是这样的:
<>之前+---------------+ +-----------------+| t1(变量)|----->| Thingy instance |+---------------+ +-----------------+| field: value ||……|+-----------------+之前如果我们这样做:
Thingy t2 = t1;
我们:<>之前+---------------+| t1(变量)|——++---------------+ ||| +-----------------++-->| Thingy instance || +-----------------+| | field: value |+---------------+ | |…|| t2(变量)|——+ +-----------------++---------------+之前 pippo
和obj
的情况完全相同。
在使用关键字new
创建对象时,需要对堆有深入的了解。这个对象将在堆上创建,如果您使用=符号来分配一个对象来等于另一个对象,您实际上会在堆上引用同一个对象。
Person person = new Person();
Person clone = person;
person.FirstName = "John";
clone.LastName = "Doe";
这段代码将只在堆上创建一个对象,名字是John,姓氏是Doe。如果你想创建对象的副本,你需要查看.clone()
方法。
对于这个问题,如果你做了类似于obj1 = obj2;
的事情,那么是的。