Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 克隆对象_Java_Object_Clone - Fatal编程技术网

Java 克隆对象

Java 克隆对象,java,object,clone,Java,Object,Clone,为了制作对象的副本并访问其数据,什么更好?为什么 1。创建一个新对象,并用您想要的数据初始化它 通过构造函数进行克隆 HashSet<String> myClone = new HashSet<String>(data); HashSet myClone=新的HashSet(数据); 2。按原样克隆对象并将其转换为您认为的类型 HashSet<String> myClone = (HashSet<String>) data.clone();

为了制作对象的副本并访问其数据,什么更好?为什么

1。创建一个新对象,并用您想要的数据初始化它 通过构造函数进行克隆

 HashSet<String> myClone = new HashSet<String>(data);
HashSet myClone=新的HashSet(数据);
2。按原样克隆对象并将其转换为您认为的类型

 HashSet<String> myClone = (HashSet<String>) data.clone();
HashSet myClone=(HashSet)data.clone();

克隆不复制数据,而是复制引用()。因此,如果你想做一个深度的“复制”,并且它独立于第一个,你必须做一个“逐项克隆”,通常被称为(有几种方法来完成这个)


另外,您还可以查看实现该HashSet的类的
clone()
方法。如果该类重写了该方法,那么它可能会执行深度复制。我向你推荐这本书:

一定要使用复制构造函数-
clone()
真的很糟糕(至少大多数人都这么认为。)详细信息请参见。

视情况而定。并非所有类都有复制构造函数。有些类定义
clone()
,而其他类则从
对象继承它

如果您正在考虑如何在自己的类中实现复制语义,许多人建议不要克隆,但其他人建议这样做。第三种方法是静态工厂方法


如果您试图复制某个现有类,那么您将受制于现有实现。也许它有一个
clone()
可以满足您的需要,也许它没有。也许它有一个复制构造函数,也许它没有。

可能重复的@Mansoor是对的:复制构造函数肯定是正确的。@mre:直接使用复制构造函数意味着新对象将是指定类型的对象,而不是类型与被复制对象匹配的对象。在某些情况下,这可能非常糟糕。在ToyotaPrius上调用车辆的复制构造器将生成与车辆相关的属性与复制的ToyotaPrius匹配的车辆,但原始车辆中的任何丰田普锐斯特定信息将在复制中忽略。这样的语义可能偶尔需要,但通常需要的是属性与原始属性匹配的ToyotaPrius。@mre:如果类有一个从Object.clone派生的正确实现的虚拟克隆方法,则派生类可以使用调用base.clone的方法覆盖该方法,然后执行任何必要的“修复”,或者,如果没有必要进行修复,则可以简单地保留继承的方法。如果任何祖先的Clone方法调用构造函数而不是Clone,那么具有公共Clone方法的每个类都必须重写它以调用副本构造函数。否则将导致不正确的行为。