每当我进行浅层克隆时,如果我的类由任何用户定义的引用类型组成,那么会复制引用值,但不会复制值,但如果我正在编写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的特殊处理。