JAVA-Clone 对象拷贝
JAVA 中对象的赋值是复制对象的引用,即复制引用
public static void main(String[] args) {
User user = new User(1,"asds",18);
User user1 = user;
System.out.println(user);
System.out.println(user1);
}

JAVA 中复制对象(克隆副本,互不影响)
使用 clone() 方法要求被克隆对象实现 Cloneable 接口,修改覆盖的 clone() 方法的修饰符为 public
public class User implements Cloneable {
private Integer id;
private String name;
private Integer age;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
再测试
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User(1,"asds",18);
User user1 = (User) user.clone();
System.out.println(user);
System.out.println(user1);
}

浅拷贝
public class Address {
private String address;
public class User implements Cloneable {
private Integer id;
private String name;
private Integer age;
private Address address;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
测试
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("wuhan");
User user = new User(1,"asds",18,address);
User user1 = (User) user.clone();
// System.identityHashCode() 获取对象唯一标识,若对象不重写 hashCode() 则值和 Object.hashCode() 一样
System.out.println(System.identityHashCode(user)+"\t"+user);
System.out.println(System.identityHashCode(user1)+"\t"+user1);
user.getAddress().setAddress("beijing");
System.out.println(user.hashCode()+"\t"+user);
System.out.println(user1.hashCode()+"\t"+user1);
}

只修改 user,但 user1 也被修改
clone() 方法:属性为基本类型拷贝其值,属性为非基本类型拷贝其引用
深拷贝
public class Address implements Cloneable {
private String address;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public class User implements Cloneable {
private Integer id;
private String name;
private Integer age;
private Address address;
@Override
public Object clone() throws CloneNotSupportedException {
Object clone = super.clone();
Object addressClone = ((User) clone).getAddress().clone();
((User) clone).setAddress((Address) addressClone);
return clone;
}
再测试

实现完整的深拷贝,需要被复制对象的继承链、引用链上的每一个对象都实现克隆机制
被克隆的对象的属性都是基本类型,那只需要被克隆类实现 cloneable 接口即可,若对象的属性包含其他非基本类型对象,那么这些非基本类型的对象都需要实现 cloneable 接口
对象属性少这样做还可以完成深拷贝,如果有多个对象属性,多层引用关系,就会比较棘手,这时候可用JAVA的序列化机制来完成对象的深拷贝
https://blog.csdn.net/54powerman/article/details/64920431
JAVA-Clone 对象拷贝的更多相关文章
- Java Object 对象拷贝答疑
Java Object 对象拷贝答疑 @author ixenos 摘要:在对象的clone过程需要注意的几点.关于关键字this.super 关于clone[对象拷贝] 在实际编程过程,有时候我们会 ...
- Java Object 对象拷贝
Java Object 对象拷贝 @author ixenos JAVA 对象拷贝 Java里的clone分为: 1.浅拷贝:浅复制仅仅复制所考虑的对象,而不复制它所引用的对象,Object类里的c ...
- Java中对象拷贝的两种方式
引用的拷贝 //引用拷贝 private static void copyReferenceObject(){ Person p = new Person(23, "zhang") ...
- 通过与C++程序对比,彻底搞清楚JAVA的对象拷贝
目录 一.背景 二.JAVA对象拷贝的实现 2.1 浅拷贝 2.2 深拷贝的实现方法一 2.3 深拷贝的实现方法二 2.3.1 C++拷贝构造函数 2.3.2 C++源码 2.3.3 JAVA通过拷贝 ...
- java bean对象拷贝
Java的bean的属性复制,大家可以都看一下. 谈谈Java开发中的对象拷贝http://www.wtnull.com/view/2/e6a7a8818da742758bcd8b73d49d6be2 ...
- java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))
Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0) 阅读目录 为什么要克隆? 如何实现克隆 浅克 ...
- java clone对象
本文转载至 http://blog.csdn.net/shootyou/article/details/3945221 现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个词语确实很“火”过 ...
- java Clone之深浅拷贝
要点: 1.浅度拷贝可以不实现Cloneable接口(自动使用Object.clone)或者不重写Cloneable的clone方法. 2.要被深度拷贝的类必须实现Cloneable接口并重写clon ...
- JAVA 对象拷贝
1.java里的clone分为: A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍. Java中对 ...
- java克隆对象clone()的使用方法和作用
转自:997.html">http://www.okrs.cn/blog/news/?997.html 内容摘要 若需改动一个对象,同一时候不想改变调用者的对象.就要制作该对象的一个本 ...
随机推荐
- Codeforces Round #542 Div. 1
A:显然对于起点相同的糖果,应该按终点距离从大到小运.排个序对每个起点取max即可.读题花了一年还wa一发,自闭了. #include<iostream> #include<cstd ...
- PHP——生成唯一序列号UUID
<?php function uuid($uid = '') { $chars = md5(uniqid(mt_rand(), true)); $uuid = substr($chars, 0, ...
- HDU 4256 翻译罗马数字
参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6414173.html The Famous Clock Time Limit: 2000/1000 ...
- 学习Android过程中遇到的问题及解决方法——电话监听
也许有时你会有这样一个需求:通电话时有一个重要的事需要记下来或者和一个陌生人特别是大骗子通话时,这是就想如果能把通话录下来就方便多了.(这才是我写这个代码的目的!!!) 在此过程中,犯了一个很大的错误 ...
- tp5命令行基础介绍
查看指令 生成模块 生成文件 生成类库映射文件 生成路由缓存文件 生成数据表字段缓存文件 指令扩展示例 命令行调试 命令行颜色支持 调用命令 查看指令 命令行工具需要在命令行下面执行,请先确保你的ph ...
- 解决Eclipse每次修改完代码后需要先Clean,不然修改的代码无效
工具栏 Project-->Build Automatically 勾选上即可
- GitHub Desktop 出现“please upgrade your plan to create a new private repository”的解决办法
转:https://blog.csdn.net/qq_38584262/article/details/82386805 解决办法:去掉最下面的勾
- Hdoj 2191.悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 题解
Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品 ...
- 【linux】Linux系统SELinux简介
安全加强型Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统. 是linux安全加强的另一种实现方式. ...
- 解题:SDOI2018 战略游戏
题面 先圆方树然后建虚树,答案就是虚树大小.虚树没必要建出来,把原来的点的点权设为1,直接dfs序排序后相邻点求距离加上首尾两个点的距离,最后除以二(画一下可以发现是正反算了两遍),注意还要去掉询问点 ...