java中的拷贝分为深拷贝和浅拷贝,一般来说类必须实现java.lang.Cloneabel接口而且使用public访问权限重写clone方法
下面先我们来实现浅拷贝
person1.java的代码如下:
public class Person1 implements Cloneable{
private Car car; //这个人的车
private String name;//名字
public Person1(String name,String carName){
this.name = name;
car = new Car(carName);
}
@Override
public Object clone() {
try{
return super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
return null;
}
}
public Car getCar() {
return car;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
car.java 类的代码如下:
public class Car {
private String name;
public Car(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类ShallowCopyTest的代码入下:
public class ShallowCopyTest {
public static void main(String[] args){
Person1 person = new Person1("zhangsan", "aodi");
System.out.println("Original value --->" + person.getName()
+ " has--> " + person.getCar().getName());
Person1 q = (Person1) person.clone();
System.out.println("clone value --->" + q.getName() + " has--> "
+ q.getCar().getName());
q.setName("lisi");
q.getCar().setName("benci");
System.out.println("clone(After) value --->" + q.getName() + " has--> "
+ q.getCar().getName());
System.out.println("clone value --->" + person.getName() + " has--> "
+ person.getCar().getName());
}
}
在ShallowCopyTest中我们先生成了Person1的一个实例然后输出了他的信息然后我们通过浅拷贝赋值给另一个Person
对象接着输出了这个对象的信息,接着我们通过这个对象进行了一些信息的修改,接着我们输出了这个对象的信息和原来那个对象的信息。
当我们运行上面的ShallowCopyTest类时输出:
Original value --->zhangsan has--> aodi
clone value --->zhangsan has--> aodi
clone(After) value --->lisi has--> benci
clone value --->zhangsan has--> benci
接下来我们实现深拷贝:
Person2.java的代码和Person1的代码大致相同只是重写的clone的内容改为:
@Override
public Object clone() {
Person2 person = new Person2(name,car.getName());
return person;
}
car类不变;
测试类DeepCopyTest的代码如下:
public class DeepCopyTest {
public static void main(String[] args){
Person2 person = new Person2("zhangsan", "aodi");
System.out.println("Original value --->" + person.getName()
+ " has--> " + person.getCar().getName());
Person2 q = (Person2) person.clone();
System.out.println("clone value --->" + q.getName() + " has--> "
+ q.getCar().getName());
q.setName("lisi");
q.getCar().setName("benci");
System.out.println("clone(After) value --->" + q.getName() + " has--> "
+ q.getCar().getName());
System.out.println("clone value --->" + person.getName() + " has--> "
+ person.getCar().getName());
}
}
运行这个类输出:
Original value --->zhangsan has--> aodi
clone value --->zhangsan has--> aodi
clone(After) value --->lisi has--> benci
clone value --->zhangsan has--> aodi
接下来我们看看深拷贝和浅拷贝输出有什么异同
相同:当拷贝的对象中含有基本类型时,当通过拷贝对像(q)改变属性值时原对象(person)的属性值不会改变
不同 : 当考拷贝对象含有其他对象的引用时,在浅拷贝中拷贝对像(q)和原对象(person)共享其他对象的引用
拷贝对像(q)改变引用属性值时原对象(person)的引用属性值也相应改变。相反在生拷贝中拷贝对像(q)和原对象(person)不共享其他对象的引用,拷贝对像(q)改变引用属性值时原对象(person)的引用属性值不会改变