与构造函数相比,用clone()创建对象的优势是什么



每当我进行浅层克隆时,如果我的类由任何用户定义的引用类型组成,那么会复制引用值,但不会复制值,但如果我正在编写String s="something",那么即使s是一个对象,但它会直接复制到克隆的对象中,为什么会这样呢?这是否意味着预定义的对象将被复制,但用户定义的对象引用将被复制?

如果您想要一个具有相同状态的对象,那么您可以使用clone()。如果两者之间没有区别,我会说使用构造函数。克隆需要一个已经创建的对象才能创建另一个实例,更不用说Cloneable的实现已经相当混乱了。

还要注意,您尝试对其使用clone()的对象必须实际实现Cloneable并重写该方法才能实际工作。

并不是说"预定义"的对象类型是深度复制的,而是"用户定义的"对象类型是浅层复制的。

你引用的例子是:

String s = "something";

是的,字符串文字是一个"对象",但字符串是不可变的对象,更重要的是,它们在语言本身的设计中是特殊的。实际上,您在这里所做的与说YourClass varName = new YourClass();没有什么不同。在这里,您创建了一个值为"something"的新String对象(如果字符串常量池中不存在文本),并将对该对象的引用存储到类型为String的变量s中。

你可以像浅层复制用户定义的对象一样浅层复制字符串:

String s = "something"; //in this example this would be the same as saying new String("something")
String imAShallowCopyOfS = s;
System.out.println(imAShallowCopyOfS == s); //true

您仍然只是将s指向的引用复制到imAShallowCopyOfS中。不过,我建议您不要使用字符串来学习java中引用的行为,因为它们是相当特殊的对象,会受到编译器/vm的特殊处理。

最新更新