每当我进行浅层克隆时,如果我的类包含任何用户定义的引用类型,则会复制引用值但不会复制值,但如果我正在编写String s="something"
,那么即使{{1是一个对象但是它被直接复制到克隆对象中,为什么呢?是否意味着将复制预定义的对象,但是将复制用户定义的对象引用?
答案 0 :(得分:0)
如果您想要一个具有相同状态的对象,那么您可以使用clone()
。如果两者之间没有区别,我会说使用构造函数。克隆需要已经创建一个对象才能创建另一个实例,更不用说Cloneable
的实现已经相当混乱了。
另请注意,您尝试使用clone()
的对象必须实际实现Cloneable
并覆盖该方法才能实际运行。
答案 1 :(得分:0)
这不是"预定义"对象类型被深度复制并且"用户定义"对象类型是浅层复制的。
你引用的例子是:
String s = "something";
是的,字符串文字是"对象"但是字符串是不可变对象,更重要的是它们是特殊的,直到它们被构建到语言本身的设计中。真的,你在这里做的与说YourClass varName = new YourClass();
没什么不同。在这里,你创建一个新的String对象,其值为#34;某些东西" (如果string constant pool中不存在该文字)并将该对象的引用存储到s
类型的变量String
。
您可以浅浅地复制字符串,就像浅层复制用户定义的对象一样:
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的一些特殊处理。