使用=运算符共享Java对象的生命周期

时间:2015-10-24 11:04:12

标签: java

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对象,这意味着objpluto.pippo因{{1}而具有相同的“生命”运营商?

2 个答案:

答案 0 :(得分:6)

  

问题:此类修改是否也适用于Class1 pluto对象,

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

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

当然,如果您通过一个引用更改该对象的状态,则通过另一个引用可以看到该更新状态。

我们来看一个更简单的例子:

Thingy t1 = new Thingy();

这让我们记忆犹新:

+---------------+      +-----------------+
| t1 (variable) |----->| Thingy instance |
+---------------+      +-----------------+
                       | field: value    |
                       | ...             |
                       +-----------------+

然后,如果我们这样做:

Thingy t2 = t1;

我们有:

+---------------+
| t1 (variable) |--+
+---------------+  |
                   |
                   |   +-----------------+
                   +-->| Thingy instance |
                   |   +-----------------+
                   |   | field: value    |
+---------------+  |   | ...             |
| t2 (variable) |--+   +-----------------+
+---------------+

pippoobj的情况完全相同。

答案 1 :(得分:2)

当您使用关键字new创建对象时,需要很好地理解堆。此对象将在堆上创建,如果使用=符号将对象分配给另一个对象,则实际上将在堆上引用相同的对象。

Person person = new Person();
Person clone = person;

person.FirstName = "John";
clone.LastName = "Doe";

此代码仅在堆上创建一个对象,第一个名称为John和姓氏Doe。我想创建对象的副本,您需要查看.clone()方法。

问题是,如果你做的事情与obj1 = obj2;类似,那么就是。