为什么我们在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() 这是一个很好的例子