java浅拷贝和深拷贝

Object 类的 clone方法执行特定的克隆操作。

首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException(注意:所有的数组都被视为实现接口 Cloneable)否则,此方法会创建此对象的类的一个新实例,并像通过分配,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我克隆。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。

Object 类本身不实现接口 Cloneable,所以在类为 Object的对象上调用 clone 方法将会导致在运行时抛出异常。

 

下面从三个复制的实例代码来看它们之间的区别,我们需建立Person类:

public class Person{

    private String name;

    private int age;

   public Person(String name, int age) {

       this.name = name;

       this.age = age;

    }

   public void setAge(int age) {

       this.age = age;

    }

   public void setName(String name) {

       this.name = name;

    }

   public void display() {

       System.out.println("Name:" + name + "/tAge:" + age);

    }

}

 

一、普通复制

即我们最容易想到的将一个对象赋值给另外一个对象。

public static void main(String[] args) {

       Person p1=new Person("jack",20);

       Person p2=p1;

       p1.setAge(49);//简单复制

       p2.display();

       p1.display();

       System.out.println(p1);

       System.out.println(p2);

    }

 

结果:        Name:jack    Age:49

               Name:jack   Age:49

               net.pcedu.clone.Person@c17164

               net.pcedu.clone.Person@c17164

说明p1p2对象的是同一个引用,所以再改属性2个都是改变的。

 

二、浅拷贝

浅拷贝必需对Book类实现Cloneable接口的clone方法

         public class Book implements Cloneable{

         String bookName;

         double price;

         Person author;

         public Book(String bn,double price,Person author){

                bookName = bn;

                this.price = price;

                this.author = author;   

         }   

         public Object clone(){

           Book b = null;

           try{

               b = (Book)super.clone();

           }catch(CloneNotSupportedExceptione){

               e.printStackTrace();

           }

            return b;

         }

         public void display(){

             System.out.print(bookName + "/t" +price + "/t") ;

              author.display();   

         }

        }

publicstatic void main(Stringargs[]){

      Book b1 = new Book("Java编程",30.50,new Person("张三",34));

      Book b2 = (Book)b1.clone();

      b2.price = 44.0;

      b2.author.setAge(45);

      b2.author.setName("李四");

      b2.bookName = "Java开发";

      b1.display();

      b2.display();

    }

结果:

Java编程  30.5   Name:李四 Age:45

Java开发  44.0   Name:李四 Age:45

说明p1p2是不同的对象,但是p1对象的属性值也拷贝到p2中去了。

 

问题如下: 发现在改变b2author对象属性时b1author对象的属性也改变了,说明在浅拷贝中的author这个对象没有被完全拷贝,而是使用同一引用,这样就要使用深拷贝了。

 

三、深拷贝

为了解决如上问题,我们需要用到深拷贝,其实很简单在拷贝book对象的时候加入如下语句

 b.author =(Person)author.clone(); //Person对象进行拷贝,Person对象需进行了拷贝

 在运行上面的main方法,结果如下:

  Java编程30.5   Name:张三 Age:34

Java开发44.0   Name:李四 Age:45

说明p1p2是不同的对象,但是p1对象的属性值也拷贝到p2中去了(含引用对象属性的拷贝)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值