Java中对象的克隆

Java中对象的克隆

1)  为了获取对象的一份拷贝,可以利用Object类的clone()方法。

2)  在派生类中覆盖基类的clone()方法,并声明为public

3)  在派生类的clone()方法中,调用super.clone()

4)  在派生类中实现Cloneable接口。

5)  为什么在派生类中覆盖Objectclone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。

 

以下代码为Student类实现克隆,首先其必须实现Cloneable接口,如果不实现此接口,则会在调用clone方法时抛出CloneNotSupportedException异常,Cloneable接口中无任何抽象方法。然后重写clone方法。

class Student implements Cloneable

{

        String name;

        int age;

        Professor p;

        Student(String name,int age,Professor p)

        {

               this.name=name;

               this.age=age;

               this.p=p;

        }

        

        public String toString()//重写toString方法,可以直接打印Student对象

        {

              return "name="+this.name+",age="+this.age+","+this.p;

        }

        

        public Object clone ()

        {

               Object o=null;

               try

               {

                   o=super.clone();

               }

               catch(CloneNotSupportedException e)

               {

                    System.out.println(e.toString());

               }

               return o;

        }

}

 

class Professort

{

     String name;

        int age;

        Professor(String name,int age)

        {

               this.name=name;

               this.age=age;

        }

         public String toString()//重写toString方法,可以直接打印Professor对象

        {

              return "professor="+this.name+","+this.age;

        }

}

在主函数中即可用以下代码来实现克隆:

       Professor p=new Professor("wangwu",50);

Student st=new Student("zhangshan",20,p);

          Student st1=(Student)st.clone();

此时还可以为st1对象单独赋值,而不改变st的值

st1.name="lisi";

          st1.age=23;

 

但是如果使用下面代码为st1中的Professor p赋值,由于Professor p为一个对象,为引用拷贝,故此时stst1中的pnameage均变成修改后的。

st1.p.name="zhouxiao";

          st1.p.age=40;

 

如果要使得stpnameage不随st1pnameage值的改变,则必须对Professor类实现克隆方法,修改代码如下:

class Professor implements Cloneable

{

        String name;

        int age;

        Professor(String name,int age)

        {

               this.name=name;

               this.age=age;

        }

         public String toString()

        {

              return "professor="+this.name+","+this.age;

        }

         public Object clone ()

        {

               Object o=null;

               try

               {

                   o=super.clone();

               }

               catch(CloneNotSupportedException e)

               {

                    System.out.println(e.toString());

               }

               return o;

        }

      

}

 

class Student implements Cloneable

{

        String name;

        int age;

        Professor p;

        Student(String name,int age,Professor p)

        {

               this.name=name;

               this.age=age;

               this.p=p;

        }

        

        public String toString()

        {

              return "name="+this.name+",age="+this.age+","+this.p;

        }

        

        public Object clone ()

        {

               Student o=null;

               try

               {

                   o=(Student)super.clone();

               }

               catch(CloneNotSupportedException e)

               {

                    System.out.println(e.toString());

               }

               o.p=(Professor)p.clone();  //实现p的克隆

               return o;

        }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值