Java的深度克隆和浅度克隆
2024-10-15 10:43:55
说到克隆,其实是个比较简单的概念,跟现实生活正的克隆一样,复制一个一模一样的对象出来。clone()这个方法是从Object继承下来的,一个对象要实现克隆,需要实现一个叫做Cloneable的接口,这个接口没有什么方法,和Comparable接口差不多,仅仅是起一个标志作用,实现了这个接口你就能实现克隆操作。
这里有两个概念,深度克隆和浅度克隆,这东西虽然平常不怎么用,但是了解一下还是有必要的。Object中的克隆方法是浅度克隆,JDK规定了克隆需要满足的一些条件,简要总结一下就是:对某个对象进行克隆,对象的的成员变量如果包括引用类型或者数组,那么克隆的时候其实是不会把这些对象也带着复制到克隆出来的对象里面的,只是复制一个引用,这个引用指向被克隆对象的成员对象,但是基本数据类型是会跟着被带到克隆对象里面去的。而深度可能就是把对象的所有属性都统统复制一份新的到目标对象里面去。简单画个图:
写了几行代码测试一下:(针对数组,对象其实跟数组是一样的)
class Person implements Cloneable {
String name;
String password;
String[] arrFavor; public Person(String name, String password, String[] arrFavor) {
this.name = name;
this.password = password;
this.arrFavor = arrFavor;
} @Override
protected Object clone() {
Person person = null;
try {
person = (Person) super.clone();
// person.arrFavor = arrFavor.clone();
return person;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
} public class Test4 {
public static void main(String[] args) {
String[] arrFavor = { "basketball", "football" };
Person person = new Person("Jay", "123", arrFavor);
Person p = (Person) person.clone();
System.out.println(p.name);
System.out.println(p.password);
p.name = "Jolin";
p.password = "555";
p.arrFavor[0] = "valiball";
for (String favor : p.arrFavor) {
System.out.print(favor + " ");
}
System.out.println();
for (String favor : person.arrFavor) {
System.out.print(favor + " ");
}
System.out.println();
}
}
// 结果
// Jay
// 123
// valiball football
// valiball football
而如果要进行所谓的深度克隆,在重写clone方法的时候把属性也克隆一下,也就是上面代码的去掉17行注释。
最新文章
- 2016 Multi-University Training Contest 2 D. Differencia
- MaxScale:实现MySQL读写分离与负载均衡的中间件利器
- display:inline、block、inline-block的区别
- 团队第二周:SRS文档
- wp7 中 HubTile控件自定义大小。
- iOS系统自带正则表达式简单运用
- 不再让内容把td撑开
- JS 页面加载触发事件 document.ready和onload的区别(转)
- IIS 部署WCF服务注意事项
- Golang开发环境搭建(Notepad++、LiteIDE两种方式以及martini框架使用)
- Spark源码剖析(六):Worker原理与源码剖析
- Android Studio 受不了了
- docker~swarm搭建docker高可用集群
- 004_wireshark专题
- Fedora 29 使用 SCL (Software Collections)
- 使用jquery-combobox实现select下拉框多选之后,如何将下拉框的值传给input隐藏域
- [math][mathematica] archlinux 下 mathematica 的安装 (科学计算软件 mathematica/matlab/sagemath)
- 省市区联动JS脚本
- linux基础环境部署
- const 与过载