
clone()方法用于创建实现Cloneable接口的类的对象副本。默认情况下,它会逐字段复制,因为 Object 类不知道其对象调用此方法的特定类的成员。因此,如果该类仅具有原始数据类型成员,则将创建该对象的新副本,并返回对新对象副本的引用。但是,如果类包含任何类类型的成员,则仅复制对这些成员的对象引用,因此原始对象和克隆对象中的成员引用都引用同一对象。
如果我们尝试对未实现 Cloneable 接口的类的对象调用 clone() 方法,我们将收到 CloneNotSupportedException 。该接口是一个标记接口,该接口的实现仅表明可以在实现类的对象上调用Object.clone()方法。
<strong>protected Object clone() throws CloneNotSupportedException</strong>
我们可以通过两种方式实现clone()方法
这是Object.clone()提供的默认克隆功能的结果 方法(如果类也有非基本数据类型成员)。在浅复制的情况下,克隆对象还引用原始对象所引用的同一对象,因为仅复制对象引用,而不复制引用的对象。
public class ShallowCopyTest {
public static void main(String args[]) {
A a1 = new A();
A a2 = (A) a1.clone();
a1.sb.append("Tutorialspoint!");
System.out.println(a1);
System.out.println(a2);
}
}
class A implements Cloneable {
public StringBuffer sb = new StringBuffer("Welcome to ");
public String toString() {
return sb.toString();
}
public Object clone() {
try {
return super.clone();
} catch(CloneNotSupportedException e) {
}
return null;
}
}Welcome to Tutorialspoint! Welcome to Tutorialspoint!
我们需要为非基本类型的类重写clone()方法成员来实现深度复制,因为它还需要克隆成员对象,而默认克隆机制不会这样做。
立即学习“Java免费学习笔记(深入)”;
public class DeepCopyTest {
public static void main(String args[]) {
A a1 = new A();
A a2 = (A) a1.clone();
a1.sb.append(" TutorialsPoint!");
System.out.println(a1);
System.out.println(a2);
}
}
class A implements Cloneable {
public StringBuffer sb = new StringBuffer("Welcome to ");
public String toString() {
return sb.toString();
}
public Object clone() {
try {
A a = (A) super.clone();
a.sb = new StringBuffer(sb.toString());
return a;
}
catch(CloneNotSupportedException e) {
}
return null;
}
}Welcome to TutorialsPoint! Welcome to
以上就是在Java中,clone()方法的重要性是什么?的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号