使用=操作符实现Java对象的共享寿命



Class1有一个类型为Class2的属性,命名为pippo:

public class Class1{
           private Class2 pippo; //an attributo of Class1
           .....
           public Class2 getPippo()
           { return this.pippo;}
}

现在考虑一个名为plutoClass1的良好形式实例,并考虑以下流程:

Class2 obj=pluto.getPippo();
// I apply some modification on obj 

现在Class1类型的实例obj明显被修改了。

问题:这样的修改是否也适用于Class1 pluto对象,这意味着objpluto.pippo是否由于=操作符而具有相同的"生命"?

问题:这样的修改是否也适用于Class1 pluto对象,

这个问题的答案是:这个问题本身就是一个误解。: -)

pippoobj都是指向相同的对象的变量。所以没有两个对象以某种方式链接,只有一个对象有两个引用(指针)指向

因此,如果你通过一个引用改变了对象的状态,那么更新后的状态在另一个引用中是可见的。

让我们看一个简单的例子:

Thingy t1 = new Thingy();

在内存中是这样的:

<>之前+---------------+ +-----------------+| t1(变量)|----->| Thingy instance |+---------------+ +-----------------+| field: value ||……|+-----------------+之前

如果我们这样做:

Thingy t2 = t1;
我们:

<>之前+---------------+| t1(变量)|——++---------------+ ||| +-----------------++-->| Thingy instance || +-----------------+| | field: value |+---------------+ | |…|| t2(变量)|——+ +-----------------++---------------+之前

pippoobj的情况完全相同。

在使用关键字new创建对象时,需要对堆有深入的了解。这个对象将在堆上创建,如果您使用=符号来分配一个对象来等于另一个对象,您实际上会在堆上引用同一个对象。

Person person = new Person();
Person clone = person;
person.FirstName = "John";
clone.LastName = "Doe";

这段代码将只在堆上创建一个对象,名字是John,姓氏是Doe。如果你想创建对象的副本,你需要查看.clone()方法。

对于这个问题,如果你做了类似于obj1 = obj2;的事情,那么是的。

最新更新