gpt4 book ai didi

Java克隆浅拷贝深拷贝复制构造函数嵌套对象

转载 作者:行者123 更新时间:2023-12-02 05:56:32 24 4
gpt4 key购买 nike

我编写了一个测试应用程序,来演示使用浅、深和复制构造函数的 Java 克隆。

我用浅层和深层实现了,但用复制构造函数我认为我错过了一些东西。

请查看下面的代码,让我知道复制构造函数实现的修复方法。

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 阿米特·奇里米里·ShriKrishn

编辑:

由于 Student 类包含嵌套类(Teacher)引用,简单的复制构造函数将不起作用。我们必须将Teacher的克隆(浅拷贝)与Student类的复制构造函数一起使用,这里更改了复制构造函数

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

}

其余代码相同。

最佳答案

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

对于学生:

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

关于Java克隆浅拷贝深拷贝复制构造函数嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23047100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com