java中有深克隆和浅克隆的说法,clone方法在Object类中,该方法被protect修饰,我们无法直接调用,只能实现Cloneable接口,重写clone方法,我们举个作家和书本的栗子说明

首先解释深克隆,创建作家类

public class Person implements Cloneable{private String name;private String gender;private int age;public Person(String name, String gender, int age) {this.name = name;this.gender = gender;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void display(){System.out.println("姓名:"+this.name+"性别:"+this.gender+"年龄:"+this.age);}public Object clone(){Person p = null;try {p = (Person)super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return p;}@Overridepublic String toString() {return "name=" + name + ", gender=" + gender + ", age=" + age ;}
}

然后创建书籍类

ublic class BookForDeep implements Cloneable {private String bookName;private double price;private Person author;public BookForDeep(String bookName, double price, Person author) {this.bookName = bookName;this.price = price;this.author = author;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Person getAuthor() {return author;}public void setAuthor(Person author) {this.author = author;}public void display() {System.out.println("书名:" + bookName + " 价格: " + price + "作者:" + author);}public String toString() {return "bookName: " + bookName + "price: " + price + "author:" + author;}public Object clone() throws CloneNotSupportedException {BookForDeep bfp = null;bfp = (BookForDeep) super.clone();bfp.setAuthor((Person) super.clone());return bfp;}
}

我们写一个测试类

public class TestBookForDeepClone {public static void main(String[] args) {BookForDeep bfd1 = new BookForDeep("Hadoop权威指南", 0.01, new Person("xiaoli", "female", 23));BookForDeep bfd2 = new BookForDeep("spark高级详解", 0.01, new Person("azhong", "male", 24));System.out.println(bfd1.getAuthor() == bfd2.getAuthor());bfd1.display();bfd2.display();}
}

测试结果

false
书名: Hadoop权威指南 价格: 0.01作者:name=xiaoli, gender=female, age=23
姓名:xiaoli性别:female年龄:23
书名: spark高级详解 价格: 0.01作者:name=azhong, gender=male, age=24
姓名:azhong性别:male年龄:24

我们再类测试浅克隆
创建BookForDeep类实现Cloneable在这里我们需要修改clone方法,其他地方一样

public Object clone() throws CloneNotSupportedException {return super.clone();}

写一个测试类,测试浅克隆

public class TestBookLowClone {public static void main(String[] args) throws CloneNotSupportedException {Book book1 = new Book("Hadoop权威指南", 0.1, new Person("阿中", "male", 24));Book book2 = (Book) book1.clone();System.out.println(book1.getAuthor());System.out.println(book2.getAuthor());System.out.println(book1.getAuthor() == book2.getAuthor());book1.display();book2.display();
// 浅拷贝的问题:当更新副本中属性指向的对象内容时 原对象的属性会跟着一起变化// 因为原对象中属性的对象与副本中属性的对象是同一个对象book2.getAuthor().setName("Allen");book2.getAuthor().setGender("female");book1.display();book2.display();}
}

运行结果

name=阿中, gender=male, age=24
name=阿中, gender=male, age=24
true
书名: Hadoop权威指南价格: 0.1作者:name=阿中, gender=male, age=24
姓名:阿中性别:male年龄:24
书名: Hadoop权威指南价格: 0.1作者:name=阿中, gender=male, age=24
姓名:阿中性别:male年龄:24
书名: Hadoop权威指南价格: 0.1作者:name=Allen, gender=female, age=24
姓名:Allen性别:female年龄:24
书名: Hadoop权威指南价格: 0.1作者:name=Allen, gender=female, age=24
姓名:Allen性别:female年龄:24

java设计模式-克隆模式(复制模式)相关推荐

  1. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  2. java设计模式4--建造者模式(Builder)

    本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...

  3. Java设计模式-观察者模式(订阅发布模式)

    Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...

  4. 适配接口 java_【Java 设计模式】接口型模式--Adapter(适配器)模式

    简介:[Java设计模式]接口型模式–Adapter(适配器)模式Adapter模式的宗旨就是:向客户提供接口,并使用现有的类所提供的服务,以满足客户的需求. 或者说,现在有classA的方法满足客户 ...

  5. java设计模式2-观察者模式

    java设计模式2-观察者模式 什么是观察者模式? 何谓观察者模式?观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新. 在这里,发生改变 ...

  6. Java设计模式之中介者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  7. Java设计模式之享元模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  8. java设计模式3种工厂模式

    java设计模式3种工厂模式 2010-01-08 16:06:36|  分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...

  9. Java 设计模式 Adapter 对象适配器 模式

    Java 设计模式 Adapter 对象适配器 模式 Adapter模式用于现有的程序无法直接使用,需要做适当的变换之后才能使用的情况. 涉及到的角色 Target对象:定义所需的方法. Client ...

  10. Java设计模式10,建造者模式

    目录 一.建造者模式 二.建造者模式的结构 1.抽象建造者(Builder) 2.具体建造者(ConcreteBuilder) 3.指挥者(Director) 4.产品(Product) 三.建造者模 ...

最新文章

  1. TCP/IP详解--学习笔记(9)-TCP协议概述
  2. 应用开发之WinForm开发
  3. 什么时候我们应谈及性能?
  4. 高校教师抄袭豆瓣博主文章,学校证实:基本属实!记过并调离教学科研岗位...
  5. JavaScript实现封闭区域布尔运算
  6. (软件工程复习核心重点)第七章软件维护习题
  7. 只显示小方格_excel中最有效率的插件——方方格子
  8. python爬虫步骤-Python爬虫怎么入门-初级篇
  9. Leetcode 5067.统计只含单一字母的子串
  10. Galaxy Fold上市时间推延 屏幕瑕疵是主因
  11. 2021年高压电工模拟考试系统及高压电工考试试题
  12. MEMS传感器的下一轮技术变革
  13. 如何取得/etiantian文件的权限对应的数字内容,如-rw-r--r-- 为644,要求使用命令取...
  14. 杂文-61儿童节-太阳的距离
  15. php内存设置,修改php运行内存大小的限制
  16. mac 查看端口使用情况
  17. 程序猿,你关心过自己的健康吗?
  18. br-lan、eth0、eth1及lo
  19. 在Linux下安装hping3
  20. n平方的求和公式_n的二次方怎么求和?

热门文章

  1. 论csdn博客抄袭与“转载”
  2. 终于有人喊出来:一稿多投是作者的合法权利
  3. 基于数据驱动故障预测的多台电力设备预测性维护调度
  4. Base64加密解密方法
  5. 和日本留学同学聊天想到的
  6. 反应式编程,让程序自由的翱翔
  7. 单身贵族理财大法[zz]
  8. 鸟哥的私房菜(第四版)----高清---免费!!!!
  9. Nginx HTTP缓存设置
  10. 书论63 汤临初《书指》