文章参考 https://www.cnblogs.com/acode/p/6306887.html

一、前提

1、使用clone()方法的类,必须实现Cloneable接口,

否则调用clone()方法时候,会抛出  CloneNotSupportedException

2、clone()为protected修饰符方法,所以如果想使用clone()方法,必须在子类中实现

二、实战

类关系(

Student:两个基础类型属性

一个引用类型属性)

1、创建一个Student类

@Data
public class Student implements Cloneable{ private String name; private int age; private Mother mother ; @Override
protected Object clone() throws CloneNotSupportedException {
Student student = (Student) super.clone();
try {
Mother mother1 = (Mother)mother.clone();
student.setMother(mother1);
} catch (Exception e) {
e.printStackTrace();
}
return student;
}
}

2、创建一个Mother类

@Data
public class Mother implements Cloneable { private String name; private int age; @Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

3、创建一个测试类

public class Test {

    public static void main(String[] args) throws  Exception {
//============初始化================
Mother mother = new Mother();
mother.setName("小王mama");
mother.setAge(40);
Student student = new Student();
student.setAge(1);
student.setName("小王");
student.setMother(mother);
//============克隆================
Student student2 = (Student)student.clone();
student2.setName("小李");
student2.setAge(2);
student2.getMother().setAge(45);
student2.getMother().setName("小李mama");
//============输出================
System.out.println(student);
System.out.println(student2);
}
}  

三、结果

Student(name=小王, age=1, mother=Mother(name=小王mama, age=40))
Student(name=小李, age=2, mother=Mother(name=小李mama, age=45))

四、分析

1、结果实现类深度克隆

2、如果在Student类的clone()方法中没有,进行Mother类的操作,则Mother属性只会进行引用操作

修改Student类中的clone()方法

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}

结果

Student(name=小王, age=1, mother=Mother(name=小李mama, age=45))
Student(name=小李, age=2, mother=Mother(name=小李mama, age=45))

3、歪门邪术(实现序列化接口,实现clone)  对象串行化,但是串行化却很耗时,在一些框架中,我们便可以感受到,它们往往将对象进行串行化后进行传递,耗时较多。

@Data
public class Student implements Serializable{ private static final long serialVersionUID = 1L; private String name; private int age; private Mother mother ; public Object deepClone() throws IOException,
ClassNotFoundException {
// 将对象写到流里
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
// 从流里读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}
}
@Data
public class Mother implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; }

结果:深度克隆成功

Student(name=小王, age=1, mother=Mother(name=小王mama, age=40))
Student(name=小李, age=2, mother=Mother(name=小李mama, age=45))

java-深克隆和浅克隆的更多相关文章

  1. JAVA深克隆与浅克隆1

    复制就是得到一个副本 克隆就是复制一个对象的复本.但一个对象中可能有基本数据类型,如:int,long,float    等,也同时含有非基本数据类型如(数组,集合等)被克隆得到的对象基本类型的值修改 ...

  2. java深克隆与浅克隆

    2015.9.19 6:45   星期五    1

  3. java 深克隆(深拷贝)与浅克隆(拷贝)详解

    java深克隆和浅克隆 基本概念 浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所拷贝的对象,而不复制它所引用的对 ...

  4. Java克隆--深克隆与浅克隆的区别

    克隆,就是复制一个对象的副本,而克隆又分浅克隆和深克隆.浅克隆是指克隆得到的对象基本类型的值改变了,而源对象的值不会变.但如果被克隆对象引用类型的值改变了,那么源对象的值同样会改变,因为引用类型在栈内 ...

  5. Java中的深克隆和浅克隆

    为什么要克隆 首先思考一个问题, 为什么需要克隆对象? 直接new一个对象不行吗? 克隆的对象可能包含一些已经修改过的属性, 而new出来的对象的属性都还是初始化时候的值, 所以当需要一个新的对象来保 ...

  6. 浅谈Java中的深克隆和浅克隆(阿里面试)

    在最近的秋招中,阿里和多益网络都问到了这个问题,虽然很简单,但是我还是想总结一下,感兴趣的可以看一下我的个人博客网站(Spring+MyBatis+redis+nginx+mysql)(适合菜鸟),最 ...

  7. 【java开发系列】—— 深克隆和浅克隆

    Java支持我们对一个对象进行克隆,通常用在装饰模式和原型模式中.那么什么是深克隆,什么是浅克隆呢. [浅克隆],通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的. [深克隆],克隆的时候 ...

  8. Java对象的浅克隆和深克隆

    为什么需要克隆      在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B, 并且此后对B任何改动都不会影响到A中的值 ...

  9. JavaScript的深克隆与浅克隆

    JS数据类型分为两类: 基本类型(Number.Boolean.Undefined.Null.String.Symbol(ES6新加,此处不讨论))与引用类型(Object).原始类型存储的是对象的实 ...

  10. js深克隆与浅克隆

    定义: 浅克隆: 克隆对象的一层属性, 如果对象还有对象的话,里面的对象没有进行克隆,只是把地址给了别人.也可以理解为只是简单的克隆了躯体,但是没有得到其灵魂: 深克隆:克隆对象的多层属性,对象里面还 ...

随机推荐

  1. jQuery基础教程

    1.使用$()函数 $()函数其实是创建了一个jQuery对象. 这个函数接受CSS选择符作为参数,充当一个工厂, 返回包含页面中对应元素的jQuery对象. 所有能在样式表中使用的选择符都可以传给这 ...

  2. JAVA对Excel的导入导出

    今天需要对比2个excel表的内容找出相同:由于要学的还很多上手很慢所以在这做个分享希望对初学的有帮助: 先是pom的配置: <dependency> <groupId>org ...

  3. Web前端基础——jQuery(二)

    一.jQuery 中的常用函数 1) $.map(Array,fn); 对数组中的每个元素,都用fn进行处理,fn将处理后的结果返回,最后得到一个数组 //因为这些操作,没有与dom元素相关的,所以可 ...

  4. MarkDown常用格式

    常用格式 ** :加粗 <br> : 换行 > :可以用来引用文章,很漂亮. 可以展开的文件夹格式 <details> <summary>框架</sum ...

  5. HotSpot 虚拟机对象揭秘【转载】

    对象的创建 Java 对象的创建过程, ①类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过.解 ...

  6. 百度网盘满速下载器:pandownload

    http://pandownload.com/index.html 作者提示:1.软件使用 C++ 编写2.大文件需要等待一段时间才会有下载速度3.文件名含有特殊字符可能会下载出错,请重命名再下载4. ...

  7. Harbor api 操作

    harbor 的版本为 1.5.2 为 Harbor 配置 swagger 官网参考: https://github.com/goharbor/harbor/blob/v1.5.2/docs/conf ...

  8. RSA key format is not supported

    对接支付宝时,提示RSA错误 : 请仔细检查 : 创建支付对象时,关键字参数的名字 如果公私钥是以拼接路径的方式传递给AliPay,正确的关键字参数的名字应该如下 :

  9. CSS之fontAwesome代替网页icon小图标

    引言 奥森图标(Font Awesome)提供丰富的矢量字体图标—通过CSS可以任意控制所有图标的大小 ,颜色,阴影. 网页小图标到处可见,如果一个网页都是干巴巴的文字和图片,而没有小图标,会显得非常 ...

  10. 【代码笔记】Web-ionic-头部与底部

    index代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...