在Java中为什么要使用clone()
方法?(请从内存限制的角度回答)这会减少内存使用吗?如果是,那么如何减少?这会减少内存泄漏的影响吗?
除了不要使用clone,而是实现一个复制构造函数,你还关心内存限制。
克隆的想法是创建克隆对象的精确副本。因此,在最坏情况下,之后会使用两倍的内存。实际上——稍微少一点,因为字符串经常被interned,通常不会被克隆。即使这取决于clone方法/复制构造函数的实现者。
这里有一个带有复制构造函数的简短示例:
public class Sheep {
private String name;
private Fur fur;
private Eye[2] eyes;
//...
// the copy constructor
public Sheep(Sheep sheep) {
// String already has a copy constructor ;)
this.name = new String(sheep.name);
// assuming Fur and Eye have copy constructors, necessary for proper cloning
this.fur = new Fur(sheep.fur);
this.eyes = new Eye[2];
for (int i = 0; i < 2; i++)
eyes[i] = new Eye(sheep.eyes[i]);
}
}
使用方法:
Sheep dolly = getDolly(); // some magic to get a sheep
Sheep dollyClone = new Sheep(dolly);
Animal
,该基类具有需要调用的属性。那么,复制构造函数方法是否意味着* Animal 和 Sheep *都具有复制构造函数,并且Sheep
CC必须调用super(sheep)
? - Adam Parkinsuper(sheep);
,超类将根据该实例初始化其字段。无论如何,您都需要调用超类的(一个)构造函数。 - Andreas Dolkclone()方法将一个对象的值复制到另一个对象。 使用clone()方法可以避免创建对象副本时的额外处理任务。
如下例所示,两个引用变量具有相同的值。
class Student18 implements Cloneable {
int rollno;
String name;
Student18(int rollno, String name) {
this.rollno = rollno;
this.name = name;
}
public static void main(String args[]) {
try {
Student18 s1 = new Student18(101, "amit");
Student18 s2 = (Student18) s1.clone();
System.out.println(s1.rollno + " " + s1.name);
System.out.println(s2.rollno + " " + s2.name);
} catch (CloneNotSupportedException c) {
}
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
输出:
101 amit
101 amit
如果我们需要使用许多具有相同数据的对象,则不要使用new关键字创建对象。使用clone方法创建该对象,因为使用clone方法创建对象的操作比使用new关键字快。
我们应该避免使用clone() 这里是一个好例子Here
clone
将从浅层复制开始,如果所有字段都是基元和/或不可变对象,则可能完成所需的所有工作。建议在新类中实现带有异常的clone
而没有讨论是错误的。例如,如果您将新类传递给使用基类上的 clone
的方法,则代码将失败。 - user904963