使用 .clone() 方法和 = 符号克隆对象有什么区别?

6

我真的很困惑,对于克隆对象到底是使用.clone()方法还是直接在对象之间使用=符号有什么区别。

谢谢。


可能是[Java中如何复制对象?]的重复问题(https://dev59.com/eHNA5IYBdhLWcg3wrf43) - Joe
1
可能的重复意味着它应该被投票降低吗? - user3437460
1
是的先生,我只是这个网站的新手,但我仍然感激我所得到的。 - Robert
5个回答

19
如果您创建了一只新的狗:
Dog a = new Dog("Mike");

接着:

Dog b = a;

你将会有一个 Dog 对象和两个指向同一个 Dog 对象的变量。因此,执行以下操作:
a.putHatOnHead("Fedora");

if (b.hasHatOnHead()) {
    System.out.println("Has a hat: " + b.getHatName());
}

会打印出狗戴着 Fedora 帽子的信息,因为 ab 引用了同一只狗。

相反地,做如下操作:

Dog b = a.clone();

现在你有两只狗的克隆。如果你给每只狗戴上帽子:

a.putHatOnHead("Rayden");
b.putHatOnHead("Fedora");

每只狗都会有自己的帽子。

谢谢您提供这么清晰的指导,现在事情变得更加明朗了 :) - Robert

3
让我试着向你解释一下:

Object obj = new Object();  //creates a new object on the heap and links the reference obj to that object

案例1:

Object obj2 = obj;  //there is only one object on the heap but now two references are pointing to it.

案例2:

Object obj2 = obj.clone(); //creates a new object on the heap, with same variables and values contained in obj and links the reference obj2 to it.

关于克隆方法的更多信息,您可以参考Java API文档。


谢谢你的努力,现在我可以自信地说我理解了整个概念 :) - Robert

1
在Java中,“=”符号是赋值运算符。使用“a = b”表示“我将变量a的值赋给变量b的值”。如果“b”是一个对象,则“a = b”会使“a”指向“b”指向的对象,它不会复制对象,也不会克隆对象。
如果你想要克隆一个对象,你要么手动复制(很丑陋),要么让需要被克隆的类实现“Clonable”,然后调用“clone()”。
使用“clone()”相对于“丑陋”的方式的优点在于,“clone()”让被克隆的类的开发者定义如何进行克隆以确保复制品是合法并且可行的。

0

使用=只是给同一个对象起不同的名称。而使用.clone则是创建一个新的对象,它是原始对象的副本。


-3

= 创建一个指向同一对象的新引用。 clone() 创建一个具有与早期对象相同属性的新物理对象。


3
如果问题在几年前已经得到了回答,请不要回答,除非你有新的补充内容。你所说的一切都已经包含在之前的回答中。 - klutt
2
@AnmolParikh,提醒您一下。您的回答目前正在 Meta Stack Overflow 上讨论:https://meta.stackoverflow.com/questions/349781/how-do-i-vote-late-answers-when-there-are-much-better-answers - πάντα ῥεῖ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接