1、 浅拷贝
被拷贝的对象的所有变量都含有与原来的对象相同的值,而所有对其他对象的引用仍然指向原来的对象,就是说:浅拷贝仅仅拷贝所考虑的对象而不拷贝它所引用的对象
2、 深拷贝
被拷贝的对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被拷贝过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要拷贝的对象所引用的对象都拷贝了一遍。
3、 浅拷贝和深拷贝区别
class A {
public int i;
public int j;
}
A a = new A();
浅拷贝:
A a1 = a;
深拷贝:
A a1 = new A();
a1.i = a.i;
a1.j = a.j;
4、 Java中对象的克隆
1>为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
2>在派生类中覆盖基类的clone()方法,并声明为public。
3>在派生类的clone()方法中,调用super.clone()。
4>在派生类中实现Cloneable接口。
5、 例子
实体类Test
public class Test implements Cloneable{
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Object clone(){
Object o=null;
try {
o=(Test)super.clone();
} catch (CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}
(浅拷贝) 测试类Test2
public class Test2 {
public static void main(String[] s){
Testt1=new Test();
t1.setName("t1");
t1.setSex("男");
//浅拷贝
Testt2=t1;
t2.setName("t2");
t2.setSex("女");
System.out.println("t1.name= "+t1.getName());
System.out.println("t1.sex= "+t1.getSex());
System.out.println("t2.name= "+t2.getName());
System.out.println("t2.sex= "+t2.getSex());
}
}
输出结果:
t1.name= t2
t1.sex= 女
t2.name= t2
t2.sex= 女
(深拷贝)测试类Test3
public class Test3 {
public static void main(String[] s){
Testt1=new Test();
t1.setName("t1");
t1.setSex("男");
//深拷贝
Testt2=(Test) t1.clone();
t2.setName("t2");
t2.setSex("女");
System.out.println("t1.name= "+t1.getName());
System.out.println("t1.sex= "+t1.getSex());
System.out.println("t2.name= "+t2.getName());
System.out.println("t2.sex= "+t2.getSex());
}
}
输出结果:
t1.name= t1
t1.sex= 男
t2.name= t2
t2.sex= 女