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}}。
答案 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.dog
和max
独立发展,则它们必须是单独的实例,这意味着您需要复制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
。