Java中包含引用數(shù)據(jù)類型對象的克隆實現(xiàn)

字號:

在Java中,要得到一個對象的完整拷貝不能通過"="實現(xiàn),因為這樣只實現(xiàn)了該對象的引用的拷貝,如果對該對象進行操作,針對的還是同一個對象。
    那么,如何得到一個對象的拷貝?我們可以通過JAVA給我們提供的對象克隆機制來實現(xiàn)。并且不含引用類型的對象克隆實現(xiàn)與包含引用類型的對象的克隆實現(xiàn)有所不同。
    首先,看一下只包含基本數(shù)據(jù)類型的對象的克隆實現(xiàn)(請看下面的代碼)
    class ObjectClone
    {
    public static void main(String[] args)
    {
    Student stu1=new Student(1,20,"zhangshan");
    System.out.println(stu1);
    Student stu2=(Student)stu1.clone();
    stu2.name="lishi";
    System.out.println(stu2);
    System.out.println(stu1);
    }
    }
    class Student implements Cloneable
    {
    int index;
    int age;
    String name;
    Student(int index,int age,String name,Professor p)
    {
    this.index=index;
    this.age=age;
    this.name=name;
    }
    public Object clone()
    {
    Object o=null;
    try
    {
    o=super.clone();
    return o;
    }
    catch(Exception e)
    {
    e.printStackTrace();
    return null;
    }
    }
    public String toString()
    {
    return "index="+index+","+"age="+age+","+"name="+name;
    }
    }
    輸出結(jié)果:
    index=1,age=20,name=zhangshan
    index=1,age=20,name=lishi
    index=1,age=20,name=zhangshan
    我們可以看到我們修改stu2的name成員時,沒有影響到stu1,說明獲得對象的拷貝成功。
    下面我們繼續(xù)看一下包含引用數(shù)據(jù)類型的對象的克隆實現(xiàn)。
    /
    要使一個類得到克隆功能有三步工作
    1.重定基類的clone方法并聲明為public類型。
    2.在派生類的clone方法中調(diào)用super.clone()方法實現(xiàn)對象的克隆。
    3.在派生類中實現(xiàn)Cloneable接口。
    注意事項:
    如果被克隆的對象中有引用類型的數(shù)據(jù)成員,那么該引用類型
    也應該按以上三步實現(xiàn)克隆功能,考試大提示如下面的Professor。
    2008-11-2 by Janker
    /
    class ObjectClone
    {
    public static void main(String[] args)
    {
    Professor p=new Professor("林教授",21);
    Student stu1=new Student(1,20,"zhangshan",p);
    System.out.println(stu1);
    Student stu2=(Student)stu1.clone();
    stu2.name="lishi";
    stu2.p.name="張教授";
    System.out.println(stu2);
    System.out.println(stu1);
    }
    }