为什么我们在Java中使用clone()方法?

为什么我们在Java中使用clone()方法? (请给出关于内存约束的答案。)这会减少内存使用量吗? 如果是,那怎么样? 那会降低内存泄漏的影响吗?

除了不使用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); 

我们不应该使用它。 它是一种破碎而过时的习惯用法 ,应该在新代码中避免使用。 最好尽可能使用复制构造函数。

clone()将对象的值复制到另一个对象。 clone()方法保存额外的处理任务,以创建对象的精确副本。

正如您在下面的示例中所看到的,两个引用变量具有相同的值。

 class Student18 implements Cloneable{ int rollno; String name; Student18(int rollno,String name){ this.rollno=rollno; this.name=name; } public Object clone()throws CloneNotSupportedException{ return super.clone(); } 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){} } } 

输出:

 101 amit 101 amit 

如果我们通过new关键字创建另一个对象并将另一个对象的值分配给此对象,则需要对该对象进行大量处理。 因此,为了节省额外的处理任务,我们使用了clone()方法。

如果我们需要使用许多具有相同数据的对象,则不要使用new关键字创建对象。 使用clone方法创建该对象,因为使用clone方法创建对象的操作比使用new关键字更快。

制作一个对象的副本似乎起初是一项直接的任务:

只需将所有属性的值复制到同一个类的另一个实例中即可。 但是引用其他对象的变量呢? 这些参考值的副本意味着它们将指向与第一类相同的对象。

但也许这不是我们想要的。 也许我们希望副本引用的所有对象也是独立的副本。

这两种类型的对象副本称为:

浅拷贝 – 原始对象深拷贝的所有属性的精确位拷贝 – 精确复制原语但复制引用的对象而不是引用本身。 Object类由所有Java类inheritance,包括clone()方法,该方法将为所有属性生成精确的位副本。

但是,clone()是受保护的方法。 因此,无法通过包外的任何类的实例克隆给定对象(除非它们是该对象类的子类)。 这允许类设计者明确指定要做什么类型的克隆(浅或深)。

Java需要要覆盖clone()方法的类,以实现可克隆的接口。 clone()方法也必须公开,以覆盖访问限制。

例如,HashTable类实现了cloneable。 它的clone()方法生成一个浅表副本,因此复制的HashTable的键和值将引用与原始对象相同的对象。

但是,许多核心Java类不实现可克隆。 如果为此类调用clone()方法,将导致CloneNotSupportedException。

看克隆约束

简而言之,它用于复制对象而不是引用,它增加了内存使用量。

我们应该避免使用clone() 这是一个很好的例子