如何在Java中“取消引用”一个对象

时间:2013-04-18 19:08:48

标签: java

class DogOwner {
    Dog dog;

    DogOwner(Dog dog) {
        this.dog = dog;
    }
}

class Dog {
    int age;

    Dog(int age) {
        this.age = age;
    }
}

DogOwner peter = new DogOwner(new Dog(2));
Dog max = peter.dog;
max.age = 3;

System.out.println(peter.dog.age); // 3

如果max没有peter作为对max所拥有的Dog的引用,我该如何从peter检索max?换句话说,我希望能够将peter的年龄设置为3而不更改Dog {{1}}。

6 个答案:

答案 0 :(得分:5)

您必须克隆peter.dog,或者基于它创建新实例。

答案 1 :(得分:3)

为Dog实施clone方法:

class Dog implements Cloneable
{
  public Dog clone()
  {
      try{
           return (Dog)super.clone();
      } catch (CloneNotSupportedException ex)
      {
           // should not happen
           return null;
      }
  }

}

然后用法如下:

Dog max = peter.dog.clone();
max.age = 3;

答案 2 :(得分:2)

如果您希望peter.dogmax独立发展,则它们必须是单独的实例,这意味着您需要复制peter.dog而不是仅将其分配到最大值。

您可以创建复制构造函数:

Dog(Dog otherDog) {
    this.age = otherDog.age;
}

然后

Dog max = new Dog(peter.dog);

答案 3 :(得分:1)

看看这一行:

Dog max = peter.dog;

您可以深层复制 peter.dog而不是此行,然后将副本分配给max,您已完成,您可以自由操作它。

答案 4 :(得分:1)

max peter.dog的引用。你不能只叫彼得的狗“马克斯”,把男人的狗带走!如果你不想让他成为彼得的狗,你将不得不得到一只新狗......

Dog max = new Dog(peter.dog.age);

答案 5 :(得分:0)

DogOwner peter = new DogOwner(new Dog("Max", 2)); //This creates two new objects
Dog max = peter.dog;//This sets a reference to one of those objects, somewhat indirectly

因为你的堆中只有一个Dog对象,所以peter引用指向的狗不可能与引用{{1}指向的狗不同。 }。您必须通过克隆max的狗或创建新的批发来创建新的Dog