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 对象拷贝的更多相关文章

  1. Java Object 对象拷贝答疑

    Java Object 对象拷贝答疑 @author ixenos 摘要:在对象的clone过程需要注意的几点.关于关键字this.super 关于clone[对象拷贝] 在实际编程过程,有时候我们会 ...

  2. Java Object 对象拷贝

    Java Object 对象拷贝 @author ixenos JAVA 对象拷贝 Java里的clone分为:  1.浅拷贝:浅复制仅仅复制所考虑的对象,而不复制它所引用的对象,Object类里的c ...

  3. Java中对象拷贝的两种方式

    引用的拷贝 //引用拷贝 private static void copyReferenceObject(){ Person p = new Person(23, "zhang") ...

  4. 通过与C++程序对比,彻底搞清楚JAVA的对象拷贝

    目录 一.背景 二.JAVA对象拷贝的实现 2.1 浅拷贝 2.2 深拷贝的实现方法一 2.3 深拷贝的实现方法二 2.3.1 C++拷贝构造函数 2.3.2 C++源码 2.3.3 JAVA通过拷贝 ...

  5. java bean对象拷贝

    Java的bean的属性复制,大家可以都看一下. 谈谈Java开发中的对象拷贝http://www.wtnull.com/view/2/e6a7a8818da742758bcd8b73d49d6be2 ...

  6. java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))

    Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0)   阅读目录 为什么要克隆? 如何实现克隆 浅克 ...

  7. java clone对象

    本文转载至 http://blog.csdn.net/shootyou/article/details/3945221 现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个词语确实很“火”过 ...

  8. java Clone之深浅拷贝

    要点: 1.浅度拷贝可以不实现Cloneable接口(自动使用Object.clone)或者不重写Cloneable的clone方法. 2.要被深度拷贝的类必须实现Cloneable接口并重写clon ...

  9. JAVA 对象拷贝

    1.java里的clone分为:  A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象.  b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍.  Java中对 ...

  10. java克隆对象clone()的使用方法和作用

    转自:997.html">http://www.okrs.cn/blog/news/?997.html 内容摘要 若需改动一个对象,同一时候不想改变调用者的对象.就要制作该对象的一个本 ...

随机推荐

  1. BZOJ3894文理分科——最小割

    题目描述  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...

  2. 对Redis的理解

    1.redis使用的场景 热点数据(经常会被查询,但是不经常被修改或者删除的数据)

  3. centos6.8下普通用户下quartus编程识别不到用户开发板

    前言 centos6.8下su用户下可以识别到用户的板子,能正常下板,而普通用户下无法探测到用户板子. 需要配置一下usb-blaster,不然的话,虽然quartus软件能识别,但是无法探测到FPG ...

  4. 【XSY2729】欧拉子图 无向图连通性 数学

    题目大意 给你一个\(n\)个点\(m\)条边的无向图(可能有重边),对于这个图的边集的子集(一共有\(2^m\)个),如果其导出的子图的每个联通块内都存在欧拉回路,我们就把答案加上这个子图的边数的平 ...

  5. BZOJ 5477: 星际穿越

    当初随便出的一道 思博题 竟然被交换到了八中 QAQ 然后就上了 BZOJ ...作为原作者还是把原来写的详细题解放出来吧 qwq 题意 \(n\) 个点的数,每个点初始有权值 \(v_i\) ,需要 ...

  6. 原生JS节点操作

    获取子节点 1. children 不是标准的dom属性,但是几乎被所有浏览器支持.获取子元素的元素节点(只包括元素节点) 注意:在IE中,children包含注释节点. 2. childNodes ...

  7. Manacher (最长回文序列)

    https://www.cnblogs.com/grandyang/p/4475985.html 思路是学习的是上面博客的想法,思路很清晰 优化的方法和exkmp有异曲同工的地方 博客里的内容我在这里 ...

  8. mysql 替换字符中部分字符,替换使用指定字符

    update table_name set name= replace(name,'我是','是');

  9. 51nod 1005 1027 1029 高精度

    Java大数用法参考:https://www.cnblogs.com/jin-nuo/p/5313205.html 1005 大数加法: import java.util.*; import java ...

  10. C语言中的类型转换——将字符串s转换为整数型(int)类型

    在讲类型转换之前,我们先要理解下C语言中单引号和双引号的区别. 先讲双引号,双引号就是字符串,我们要证实我们的想法,我选择写一段代码看看开: #include <stdio.h> int ...