设置Object等于另一个时的混淆

时间:2013-11-30 09:54:51

标签: java oop

假设我有一个班级Dog并且我创建了两个Dog的实例,如下所示:

Dog dog1 = new Dog();

Dog dog2 = dog1;

如果我使用

dog1.shower();

dog2还会执行通话吗?如果是这样,我如何阻止dog2调用相同的方法?

7 个答案:

答案 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); 
    
  • 您班上的{li>

    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();

enter image description here

Dog dog2 = dog1;

enter image description here

当你致电dog1.shower();时,会发生一次淋浴,因为它发生在同一个物体上。

enter image description here

你应该创建另一个狗Dog dog2 = new Dog();的实例,这样他们就不会最后洗掉同一条狗了。

enter image description here

答案 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();

这可能会解决您的问题。