3
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从中检索?换句话说,我希望能够在不改变' 的情况下将' 年龄设置为 3 。petermaxDogpetermaxpeterDog

4

6 回答 6

5

您要么必须 clone peter.dog,要么基于它创建一个新实例。

于 2013-04-18T19:11:11.483 回答
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;
于 2013-04-18T19:16:17.103 回答
2

如果你想独立进化peter.dogmax它们必须是单独的实例,这意味着你必须复制peter.dog而不是仅仅将它分配给 max。

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

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

接着

Dog max = new Dog(peter.dog);
于 2013-04-18T19:11:48.783 回答
1

看看这一行:

Dog max = peter.dog;

而不是这一行,您可以进行深度复制 peter.dog,然后将副本分配给max,您就完成了,您可以自由地操作它。

于 2013-04-18T19:11:21.360 回答
1

max已经对 的引用peter.dog。你不能只是叫彼得的狗“麦克斯”然后把男人的狗带走!如果你不想让他成为彼得的狗,你将不得不养一只新狗……

Dog max = new Dog(peter.dog.age);
于 2013-04-18T19:11:47.303 回答
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引用指向的狗不同max。您必须Dog通过克隆peter狗或批发创建新的狗来创建新的。

于 2013-04-18T19:13:14.077 回答