深复制和浅复制java,Java深复制
有三种方法可以将引用从一个对象复制到另一个对象。第一种方式是直接赋值,第二种方式是浅拷贝,第三种方式是深拷贝。
1.直接赋值
在Java中,A a1=a2,实际上是复制了一个引用,也就是说a1和a2指向同一个对象。因此,当a1发生变化时,a2中的成员变量也会发生变化。
2.浅复制(复制引用但不复制引用的对象)
浅抄,又称浅抄。创建一个新对象,然后将当前对象非静态字段复制到新对象中;如果该字段是值类型,则复制该字段;如果此字段引用类型,则复制被引用的对象,但不复制被引用的对象。因此,原始对象及其副本指的是同一个对象。
(推荐视频:java视频教程)
类简历实现可克隆的{
公共对象克隆(){
尝试{
return(简历)super . clone();
} catch(异常e) {
e . printstacktrace();
返回null
}
}
}3.深复制(复制对象和其引用对象)
也称为深度复制,它不仅复制对象本身,还复制对象中包含的引用所指向的所有对象。
班级学生实现可克隆的{
字符串名称;
int age
p教授;
学生(字符串名称,整数,教授p) {
this.name=name
this.age=年龄;
this.p=p
}
公共对象克隆(){
学生o=null
尝试{
o=(学生)super . clone();
} catch(CloneNotSupportedException e){
system . out . println(e . tostring());
}
o.p=(教授)p . clone();
返回o;
}
}使用clone()方法克隆一个对象的步骤:
1)克隆的类应该实现Cloneable接口。
2)克隆的类必须覆盖clone()方法。
那么编程时,如何选择使用哪种复制方法呢?首先,检查该类是否有只不过是基本类型的数据成员(即对象)。如果没有,就返回super.clone()。如果是,确保类中包含的所有非基本类型成员变量都被深度复制。
引申:浅复制与深复制的区别?
浅层克隆:被复制对象的所有变量都包含与原对象相同的值,而其他对象的所有引用仍然指向原对象。换句话说,浅层复制只复制所考虑的对象,而不是它所引用的对象。
深度克隆:复制对象的所有变量都包含与原始对象相同的值,引用其他对象的变量除外。引用其他对象的变量将指向复制的新对象,而不是原始对象。换句话说,深度复制复制被复制对象引用的所有对象。
扩展:
原型模式主要用于复制对象。它通过实现接口(实现Cloneable接口)和重写方法(重写Object类中的clone()方法)来完成原型模式。
原型模式中的拷贝分为“浅拷贝”和“深拷贝”:
浅拷贝:拷贝值类型成员变量的值,只拷贝引用类型成员变量的引用,不拷贝被引用对象。
复制:复制值类型成员变量的值,复制引用类型成员变量的引用对象。
(Object类的clone方法只复制对象中基本数据类型的值,不复制数组、容器对象、引用对象等。这是浅薄的复制。如果要实现深度复制,数组、容器对象、引用对象等。在原型模式下必须单独复制。)
原型模式的优点:
1.如果创建新对象很复杂,可以使用原型模式来简化对象创建过程。
2.创建一个对象总是mode,在性能上比直接创建一个对象要好很多,因为Object类的clone方法是一个局部方法,直接操作内存中的二进制流,特别是在复制大型对象的时候,性能上的差别非常明显。
原型模式的使用场景:
由于以上优点,当需要重复创建类似的对象时,可以考虑使用原型模式。例如,有必要在循环中创建一个对象。如果对象创建过程比较复杂或者有很多循环,使用原型模式不仅可以简化创建过程,还可以提高系统的整体性能。
本文来自我们,java教程专栏,欢迎学习!以上是Java中“浅拷贝”和“深拷贝”的区别和实现(带代码)的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。