我已经编写了一个测试应用程序,用于演示使用浅层、深层和复制构造函数的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 Amit Chirimiri Kripalu
15007 Amit Chirimiri ShriKrishn
编辑:
由于学生类包含嵌套类(教师)引用,简单的复制构造函数将不起作用。我们必须将克隆(浅拷贝)与学生类的拷贝构造函数一起用于教师,这里更改为拷贝构造函数
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();
本文向大家介绍C# 中浅克隆与深克隆(浅拷贝与深拷贝)的区别?相关面试题,主要包含被问及C# 中浅克隆与深克隆(浅拷贝与深拷贝)的区别?时的应答技巧和注意事项,需要的朋友参考一下 (1)浅克隆 在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。简单来说,在
一、引言 对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部数据。Java中有三种类型的对象拷贝:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)、延迟拷贝(Lazy Copy)。 二、浅拷贝 1、什么是浅拷贝 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着
本文向大家介绍Java克隆执行深拷贝,包括了Java克隆执行深拷贝的使用技巧和注意事项,需要的朋友参考一下 示例 要复制嵌套对象,必须执行深层复制,如本示例所示。
主要内容:到底是浅拷贝还是深拷贝对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存, 这种默认的拷贝行为就是 浅拷贝 ,这和调用 memcpy() 函数的效果非常类似。 对于简单的类,默认的拷贝构造函数一般就够用了,我们也没有必要再显式地定义一
浅拷贝 对于对象或数组类型,当我们将a赋值给b,然后更改b中的属性,a也会随着变化。 也就是说,a和b指向了同一块堆内存,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝。 深拷贝 那么相应的,如果给b放到新的内存中,将a的各个属性都复制到新内存里,就是深拷贝。 也就是说,当b中的属性有变化的时候,a内的属性不会发生变化。 参考链接: 深拷贝与浅拷贝的实现(一) javaScript中浅拷
本文向大家介绍javascript深拷贝和浅拷贝详解,包括了javascript深拷贝和浅拷贝详解的使用技巧和注意事项,需要的朋友参考一下 一、数组的深浅拷贝 在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。 这是为什么呢? 因为如果只是简单的赋值,它只