大家好,欢迎来到IT知识分享网。
1.Cloneable接口
Cloneable接口是标记型接口,它是内部没有方法和属性,实现Cloneable 接口来表示该类可以被克隆,才可以调用Object.clone() 方法对该类的实例进行按字段复制。如果在没有实现Cloneable 接口的实例上调用Object.clone() 方法,则会抛出CloneNotSupportedException(克隆不被支持)的异常。
2.克隆的分类
克隆分为深克隆和浅克隆。
浅克隆(shallow clone):浅克隆是指拷贝对象时仅仅copy对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。
深克隆(deep clone):不仅仅copy对象本身,而且copy对象包含的引用指向的所有对象。
浅克隆:只需要调用Object中的clone() 方法。
public class Equalis implements Cloneable{
public String name;
public int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Equalis [name=" + name + ", age=" + age + "]";
}
protected Objec clone() throws CloneNotSupportedException {
return (Equalis) super.clone();
}
}
测试
public class EqualsTest {
public static void main(String[] args) throws CloneNotSupportedException {
Equalis e = new Equalis();
e.setName("张三");
e.setAge(10);
System.out.println(e.hashCode());
Equalis e1 = e.clone();
System.out.println(e1.hashCode());
}
}
运行结果:118352462
1550089733
两者的hashcode值不同,说明clone() 方法并不是直接把e的引用直接赋给e1 ,而是在堆中重新开辟了一块空间,将e 复制过去,把新的地址返回给了e1。
深克隆:如果要进行深克隆则要进行重写Object 中的clone() 方法。
public Object clone() throws CloneNotSupportedException {
Test test = new Test(this.test.userData);
double data1 = this.data1;
String data2 = new String(this.data2);
StringBuffer data3 = new StringBuffer(this.data3.toString());
CloneableClass copy = new CloneableClass(test, data1, data2, data3);
return copy;
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21262.html