简体   繁体   English

Java clone浅拷贝Deep-copy复制构造函数嵌套对象

[英]Java clone shallow-copy deep-copy copy-constructor nested object

I have written one test app, to demonstrate Java clone using Shallow, Deep and Copy constructor. 我编写了一个测试应用程序,以演示使用Shallow,Deep和Copy构造函数的Java克隆。

I achieved with Shallow and Deep but with Copy constructor I think I am missing something. 我用Shallow和Deep实现了,但是使用Copy构造函数,我想我缺少了一些东西。

Please look in a code below and let me know the fix for Copy constructor implementation. 请查看下面的代码,让我知道Copy构造函数实现的修复。

public class CopyConstructorDemo {

    public static void main(String[] args) {

        Teacher teacher = new Teacher("Kripalu");
        Student sOrg = new Student(15007, "Amit", "Chirimiri", teacher);

        //Student sClo = sOrg;                          //Java Reference

        //Student sClo = (Student) sOrg.clone();        //CLONE


        Student sClo = new Student(sOrg);               //COPY CONSTRUCTOR

        sOrg.display();

        sClo.getTeacher().setName("ShriKrishn");

        sOrg.display();

    }


}

class Teacher implements Cloneable{

    String _name = "";

    Teacher(String name){
        this.setName(name);
    }

    String getName(){return _name;}
    void setName(String name){_name = name;}

    //For Deep copy
    //@Override
    protected Object clone(){

        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }

    }   
}

class Student implements Cloneable{

    int _rollNo;
    String _name;
    String _address;

    Teacher _teacher;

    Student(int rollNo, String name, String address, Teacher teacher){
        this.setRollNo(rollNo);
        this.setName(name);
        this.setAddress(address);

        _teacher = teacher;
    }

    Student(Student copyCons){
        this._rollNo = copyCons._rollNo;
        this._name = copyCons._name;
        this._address = copyCons._address;
        this._teacher = copyCons._teacher;

    }

    Teacher getTeacher(){return _teacher;}
    void setTeacher(Teacher teacher){_teacher = teacher;}

    int getRollNo(){return _rollNo;}
    String getName(){return _name;}
    String getAddress(){return _address;}

    void setRollNo(int rollNo){_rollNo = rollNo;}
    void setName(String name){_name = name;}
    void setAddress(String address){_address = address;}

    void display(){
        System.out.println(_rollNo+" "+
                           _name+" "+
                           _address+" "+
                           _teacher.getName());
    }

    @Override
    protected Object clone(){

        try {

            //return super.clone();     //For Shallow copy

            //For Deep copy
            Student cloned = (Student)super.clone();
            cloned.setTeacher((Teacher)cloned.getTeacher().clone());
            return cloned;

        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }

    }



}

Output (Copy constructor) 输出(复制构造函数)

15007 Amit Chirimiri Kripalu 15007阿米特(Amit Chirimiri)Kripalu

15007 Amit Chirimiri ShriKrishn 15007阿米特(Amit Chirimiri)ShriKrishn

EDIT: 编辑:

Since Student class contain Nested class (Teacher) Reference, simple copy constructor will not work. 由于Student类包含嵌套类(Teacher)参考,因此简单的复制构造函数将无法使用。 We must use cloning (shallow copy) for Teacher together with Copy constructor of Student class and here is changed copy constructor 我们必须对Teacher和Student类的Copy构造函数一起使用克隆(浅拷贝),在这里更改了拷贝构造函数

Student(Student copyCons){

    this._rollNo = copyCons._rollNo;
    this._name = copyCons._name;
    this._address = copyCons._address;
    this._teacher = (Teacher) copyCons._teacher.clone();  //FIX: thanks to Amir

}

Rest of the code is same. 其余代码相同。

That's how the copy constructor and the clone method should be: 这就是复制构造函数和clone方法的方式:

For the student: 对于学生:

 //Copy constructor for the student
 Student(Student copyCons){
    this._rollNo = copyCons._rollNo;
    this._name = copyCons._name;
    this._address = copyCons._address;
    this._teacher = copyCons._teacher.clone();
}

 //Clone for the student
 protected Student clone(){
     return new Student(this);
 }

For the teacher: 对于老师:

//This is the copy constructor
Teacher(Teacher t){
        setName(t.getName());
 }

//That's how you clone an object of type teacher
protected Teacher clone(){
   return new Teacher(this);
}

Example of use: 使用示例:

Teacher t1 =  new teacher("Teacher 1");
Teacher t1Clone = t1.clone();

Student s1 = new Student(15007, "Amit", "Chirimiri", t1);
Student s1Clone = s1.clone();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM