java中的浅克隆

来源:互联网 发布:知乎怎么发不了文章 编辑:程序博客网 时间:2024/06/10 01:53

java中的克隆方法最简单的就是通过实现Cloneable接口,重写public Object clone()方法,然后调用clone()就行了。

所谓的浅克隆是指,当所克隆的类中包含有对其他类的引用的时候,此时的克隆并没有完全克隆类中的所有元素。

代码见下:

package test2;public class Number{    int num;    Number(int num){        this.num=num;    }    @Override    public String toString(){        StringBuilder sb=new StringBuilder();        sb.append("num="+num);        return sb.toString();    }}
package test2;public class People implements Cloneable {    Number n;    int sex;    People(Number n,int sex)    {        this.n=n;        this.sex=sex;    }    public Object clone()    {        People b=null;        try {            b=(People)super.clone();        } catch (CloneNotSupportedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return b;    }    @Override    public String toString()    {        StringBuilder sb=new StringBuilder();        sb.append(n.toString()+"\n");        sb.append("sex="+sex);        return sb.toString();    }}
package test2;import java.util.*;import java.lang.*;public class MainTest {    public static void main(String[] args)    {        Number n=new Number(100);        People p=new People(n,200);        People p2=(People)p.clone();        System.out.println("the pre p is: "+"\n"+p);        System.out.println("the pre p2 is: "+"\n"+p2);        p2.n.num=102;        p2.sex=202;        System.out.println("the following p is: "+"\n"+p);        System.out.println("the following p2 is: "+"\n"+p2);    }}

运行结果如下:

the pre p is: num=100sex=200the pre p2 is: num=100sex=200the following p is: num=102sex=200the following p2 is: num=102sex=202

首先创建了一个父类Number,之后创建一个继承Number的子类People。People实现Cloneable接口,重写clone方法。

之后我在主函数中创建了一个People对象p,并初始化。然后声明一个新的People对象p2,用clone方法复制p到p2中。分别打印。可以看见,两个对象的输出是完全一样的。

之后我再单独对p2的成员单独赋值。再打印输出,可以看见,p中的Number元素也做了变化。

说明用clone()方法进行复制的时候,实际上是创建了一个新的引用p2.n,然后这个引用指向了同样一个元素。对p2.n的修改自然也会造成p.n的修改。

这相当于在C语言中只是创建了一个指向相同元素的指针,对一个指针的修改,另一个指针的数据也会改变。

初学java,不知道这样理解对不对,望高手指正。

0 0