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. BZOJ3144[Hnoi2013]切糕——最小割

    题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...

  2. quartus prime 16.0 报警告 inferring latch

    前言 当写always组合逻辑块时,可能会写出 poor code.综合时软件会推断出锁存器.例如下面代码: always @* begin 'b1) begin w = (a & b) ^ ...

  3. Linux qemu-nbd mount qemu disk image

    Linux qemu-nbd mount qemu disk image deepin@deepin:~$ deepin@deepin:~$ qemu-nbd --help Usage: qemu-n ...

  4. 来一波全套向量运算(C++)

    //头文件要求 #include <cmath> struct P{long long x, y;}p[N]; //加法 P operator +(P x, P y){return (P) ...

  5. Redhat 用代理连外网

    设置 /etc/yum.conf 添加proxy=http://web-proxy.corp.xx.com:8080 /etc/yum.repos.d/rhel-source.repo 里面改成ena ...

  6. 【转】linux清屏的几种方法

    在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢?下面笔者分享几种在linux下用过的清屏方法. 1.clear命令.这个命令将会刷新屏幕,本质上只是 ...

  7. 「HNOI2016」序列 解题报告

    「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...

  8. python装饰器中的计时器thd.strat用法

    thd = KThread(target=_new_func, args=(), kwargs=new_kwargs) thd.start() thd.join(seconds) alive = th ...

  9. CodeVS1288埃及分数(IDA*)

    在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数. 如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的. 对于一个分数a/b,表示方法有很多种,但 ...

  10. hdu 2609 How many(最小表示法)

    Problem Description Give you n ( n < 10000) necklaces ,the length of necklace will not large than ...