【问题标题】:Java clone shallow-copy deep-copy copy-constructor nested objectJava克隆浅拷贝深拷贝拷贝构造器嵌套对象
【发布时间】:2014-04-13 19:05:20
【问题描述】:

我编写了一个测试应用程序,以演示使用 Shallow、Deep 和 Copy 构造函数的 Java 克隆。

我使用 Shallow 和 Deep 实现了,但使用 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;
        }

    }



}

输出(复制构造函数)

15007 阿米特·奇里米里·克里帕卢

15007 Amit Chirimiri ShriKrishn

编辑:

由于学生类包含嵌套类(教师)引用,简单的复制构造函数将不起作用。我们必须对 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

}

其余代码相同。

【问题讨论】:

    标签: java clone copy-constructor deep-copy shallow-copy


    【解决方案1】:

    复制构造函数和克隆方法应该是这样的:

    对于学生:

     //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);
     }
    

    对于老师:

    //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);
    }
    

    使用示例:

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

    【讨论】:

    • 你的克隆方法允许有一个学生作为返回类型。您应该这样做以避免该演员表
    • \@Amir,抱歉,我没有收到您的代码。正如我已经提到的,我已经通过克隆实现了现在我必须为学生实现复制构造函数我已经编写了复制构造函数并使用它新的学生(org)现在老师你可以分享我的代码片段以及我如何使用它的意思我会在哪里打电话给新老师(组织)....我不知道
    • @AmitYadav 查看this question,看看这是否有助于您理解 AmirBawab 所说的内容。
    猜你喜欢
    • 2011-09-05
    • 2011-03-24
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多