Object类(一)Clone方法

Clone方法:

     示例:
Dog d1=new Dog();
Dog d2=d1;此时赋值表示值传递。此时并不是将d1的值赋值于d2,而是将和d1共享一个地址。换句话说如果更改d2的值,则d1的值也会跟着做相应的改变。内存分配图如下。


Object类的clone()方法创建并返回此对象的一个副本,是复制而非共享。克隆的过程是:在堆中新开辟一个空间,把原对象堆内存中的一切复制过来

克隆方法分为“浅克隆”和“深克隆”
  • 浅克隆:当类中只有基本数据类型(含String)的属性时可以使用浅克隆,Object类的clone方法已经实现了浅克隆。
实现步骤:
  1. 实现Cloneable接口;
  2. 重写Object的clone()方法;
  3. 在Main方法中,进行克隆调用clone方法。
示例:
分析:先定义以一个Person类,设置相应的属性和方法。然后再创建TestPerson类,内含Main方法。在TestPerson类中创建两个Person对象分别为p1和p2。首先对p1进行赋值,然后通过clone()方法进行对p1的克隆也即为p2。编辑p2的属性赋值,最后输出p1结果,观察相应结果。

//进行Person类的编写

public  class  Person  implements  Cloneable {

     private  String  name ;
     private  int  age  ;

     public  Person() {
         super ();
    }

     public  Person(String name,  int  age) {
         super ();
         this . name  = name;
         this . age  = age;
    }

     public  String getName() {
         return  name  ;
    }

     public  void  setName(String name) {
         this . name  = name;
    }

     public  int  getAge() {
         return  age  ;
    }

     public  void  setAge( int  age) {
         this . age  = age;
    }

     public   Object clone()  throws  CloneNotSupportedException {
         return  super  .clone();
    }
}

//编写TestPerson类
public  class  TestPerson {
     @SuppressWarnings (  "null" )
     public  static  void  main(String[] args) {
       Person p1=  new  Person( "张"  ,100);
       Person p2=  new  Person();
       p2=  null ;
       
         try  {
           p2=(Person)p1.clone();
       }  catch  (CloneNotSupportedException e) {
             //  TODO  Auto-generated catch block
           e.printStackTrace();
       }
       p2.setName(  "李" );
       System.  out .println(p1.getName());
    }
}

输出结果:张

  • 深克隆:当类中包含有引用类型(String除外)的属性时必须使用深克隆。
实现步骤:
  1. 实现数据类型的Cloneable接口(同浅克隆)
  2. 实现引用类型的Cloneable接口
  3. 重写Object的clone()方法
  4. 在Main方法中,进行克隆调用clone方法。
示例:
分析:先定义以一个Person类,设置相应的属性和方法。其中设置Address为引用类型。然后再创建TestPerson类,内含Main方法。在TestPerson类中创建两个Person对象分别为p1和p2。首先对p1进行赋值(数据类型和引用类型),然后通过clone()方法进行对p1的克隆也即为p2。编辑p2的属性赋值,最后输出p1结果,观察相应结果。

//进行Person类的编写实现Object的Cloneable接口

public   class  Person  implements  Cloneable {

      private  String  name  ;
      private   int   age  ;
      private  Address  add  ;
    
      public  Address getAdd() {
         return   add  ;
    }

      public   void  setAdd(Address add) {
         this  . add  = add;
    }

      public  Person() {
         super  ();
    }

      public  Person(String name,  int  age) {
         super  ();
         this  . name  = name;
         this  . age  = age;
    }

      public  String getName() {
         return   name  ;
    }

      public   void  setName(String name) {
         this  . name  = name;
    }

      public   int  getAge() {
         return   age  ;
    }

      public   void  setAge(  int  age) {
         this  . age  = age;
    }
    
//深克隆
      public  Object clone()  throws  CloneNotSupportedException {
       Person person=(Person) super  .clone();  //克隆基本类型
       person.  add  =(Address) add  .clone(); //克隆引用数据类型
         return  person;
    }
}
//编写引用数据类型Address类
public   class  Address  implements  Cloneable {
      private  String  prov  ;
      private  String  city  ;

      public  Address() {
         super  ();
         //  TODO  Auto-generated constructor stub
    }

      public  Address(String prov, String city) {
         super  ();
         this  . prov  = prov;
         this  . city  = city;
    }

      public  String getProv() {
         return   prov  ;
    }

      public   void  setProv(String prov) {
         this  . prov  = prov;
    }

      public  String getCity() {
         return   city  ;
    }

      public   void  setCity(String city) {
         this  . city  = city;
    }
    
      public  Object clone()  throws  CloneNotSupportedException{
         return   super  .clone();
    }

}
//编写TestPerson类
public   class  TestPerson {
      @SuppressWarnings (  "null"  )
      public   static   void  main(String[] args)  throws  CloneNotSupportedException {
       Person p1=  new  Person();
       p1.setName(  "张"  );
       p1.setAdd(  new  Address( "湖北"  , "武当"  ));
       
       Person p2=(Person)p1.clone();
       p2.getAdd().setProv(  "江西"  );
       System.  out  .println(p1.getName());
       System.  out  .println(p1.getAdd().getProv());
               
    }
}

输出结果: 张   湖北
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值