java中的深浅拷贝

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)的引用属性值不会改变

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭