假设我有一个班级Dog
并且我创建了两个Dog
的实例,如下所示:
Dog dog1 = new Dog();
Dog dog2 = dog1;
如果我使用
dog1.shower();
dog2
还会执行通话吗?如果是这样,我如何阻止dog2
调用相同的方法?
答案 0 :(得分:4)
通过撰写Dog dog2 = dog1;
,您声明了一个引用 dog2
,它将指向与dog1
相同的对象。
因此,调用dog1.shower();
或dog2.shower();
会导致相同的行为(在同一个shower()
对象上调用Dog
方法)。
如果你写
Dog dog2 = new Dog();
您让dog2
引用另一个新创建的Dog
对象。
修改强>
如果您需要dog2
引用其他Dog
并获得dog1
的所有品质,您可以选择:
按照chrylis的建议创建copy constructor。 完成后,您可以写:
// dog2 refers to new copy of `Dog`, identical to original dog1
Dog dog2 = new Dog(dog1);
Override Object.clone() Dog
。在这种情况下,您将拥有:
// dog2 refers to new copy of `Dog`, identical to original dog1
Dog dog2 = dog1.clone();
我认为你也可以用这些选项的简单例子来引用埃德加的答案。
答案 1 :(得分:3)
这就是:
Dog dog1 = new Dog();
Dog dog2 = dog1;
当你致电dog1.shower();
时,会发生一次淋浴,因为它发生在同一个物体上。
你应该创建另一个狗Dog dog2 = new Dog();
的实例,这样他们就不会最后洗掉同一条狗了。
答案 2 :(得分:2)
在你的情况下dog2
只是“指向”dog1
。无论您在dog1
中更改了什么(因为它是同一个对象),都会在dog2
中更改,反之亦然。
你可能想要做的是为你的狗实现一个复制功能,如果你想要一只具有相同属性值的狗,但这不是同一个对象:
public Dog clone() {
Dog dog = new Dog();
// now write all the attributes from the current dog, into this new dog
return dog;
}
然后像这样创建dog2:
dog2 = dog1.clone();
您也可以将其移动到Dog的构造函数中:
public Dog(Dog dogToClone) {
// here take all attributes from dogToClone and add them to this dog.
}
你的电话将是:
dog2 = new Dog(dog1);
答案 3 :(得分:1)
在你的例子中,dog2不是作为单独的狗存在,它与dog1是同一只狗。所以这只狗会洗澡,只洗一次澡。
答案 4 :(得分:0)
只是不指定Dog dog2 = dog1;
而是创建一个新对象,并在dog1
中重新分配dog2
的所有属性。
Dog dog2 = new Dog();
//Assign all the properties of dog1 to dog2 manually
当您指定dog2 = dog1
时,并不意味着您正在创建新对象,而只是创建对同一对象的引用,即两个对象都相同。
答案 5 :(得分:0)
在你的情况下,dog1和dog2指的是同一个Dog对象。 dog1和dog2是堆栈上的引用,它们指向驻留在堆上的Object。 所以调用任何一个将修改驻留在堆上的单个Dog Object。 如果您不希望这为Dog 2创建一个新对象,并将dog1的内容逐个复制到dog2。
答案 6 :(得分:0)
狗1引用了Dog()的实例,而狗2也引用了相同的实例,因此整体交替的可以交替另一个实例。如果你不想让任何狗干扰另一只狗,你可以在每个变量中制作一个新的狗实例
Dog dog1=new Dog(), dog2= new Dog();
这可能会解决您的问题。