1:clone()方法:
中文解释:是对一个对象的拷贝。实现的结果:创建两个同类
对象,拷贝的对象拥有备拷贝对象的全部引用。但在内存中是两个
对象。
注意:需要被拷贝的类必须实现Cloneable的接口和重写clone()方法。
public static void main(String[] args) {
Clone obj=new Clone();
try {
Clone obj_two=(Clone) obj.clone();
System.out.println("obj="+obj.hashCode());
System.out.println("obj_two="+obj_two.hashCode());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
深拷贝:拷贝父对象的所有应用即所有应用对应的内存
空间的内容。
浅拷贝:只是拷贝父对象的应用不拷贝所指向的内存空
中文解释:是对一个对象的拷贝。实现的结果:创建两个同类
对象,拷贝的对象拥有备拷贝对象的全部引用。但在内存中是两个
对象。
注意:需要被拷贝的类必须实现Cloneable的接口和重写clone()方法。
public static void main(String[] args) {
Clone obj=new Clone();
try {
Clone obj_two=(Clone) obj.clone();
System.out.println("obj="+obj.hashCode());
System.out.println("obj_two="+obj_two.hashCode());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
可以看到运行结果为:obj和obj_two是两个不同的地址。
深拷贝:拷贝父对象的所有应用即所有应用对应的内存
空间的内容。
浅拷贝:只是拷贝父对象的应用不拷贝所指向的内存空
间的内容。
public class Clone implements Cloneable{
private String a="abc";
private String b="abc";
public static void main(String[] args) {
Clone obj=new Clone();
try {
Clone obj_two=(Clone) obj.clone();
if(obj.a==obj.b){
System.out.println("a和b指向同一块内存空间");
}
if(obj_two.a==obj.b){
System.out.println("引用所指 的内存空间没有拷贝");
}
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
从中可以看到:String数据类型当值相同时对应同一块内存空间。
覆盖Object中的clone() 方法实现深拷贝。
创建3个类,Clone、Person、Face。其中Clone类中有Person的对象,Person中有Face类的对象。分别重写3个类的clone方法,可以实现深度拷贝。
package com.object.test;
public class Clone implements Cloneable{
private String a="abc";
private String b="abc";
Person person=new Person();;
public static Clone obj=new Clone();
public Object clone() throws CloneNotSupportedException{
Clone clone=(Clone)super.clone();
clone.person=(Person)person.clone();
return clone;
}
public void yunxing() throws CloneNotSupportedException{
Clone obj_two=(Clone) obj.clone();
Person person_1=(Person) person.clone();
System.out.println("obj.person==obj_two.person "+ (obj.person==obj_two.person));
System.out.println("obj.person.face==obj_two.person.face--------"+(obj.person.face==obj_two.person.face));
}
public static void main(String[] args) throws CloneNotSupportedException {
obj.yunxing();
}
}
package com.object.test;
public class Person implements Cloneable{
private String name;
private String address;
private char sex;
public Face face=new Face();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public Object clone() throws CloneNotSupportedException{
Person person=(Person)super.clone();
person.face=(Face)this.face.clone();
return person;
}
}
package com.object.test;
public class Face implements Cloneable{
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
运行结果:
可以看到Person和Face类的引用对象被拷贝。