由原型模式引出的关于Cloneable接口和Object的clone()方法的一些问题

为什么要克隆快速到底

示例代码

 1 class Resume
 2 {
 3     private String name;
 4     private String age;
 5     private String university;
 6     private String specialSkills;
 7     
 8     public Resume(String name, String age, String university, String specialSkills)
 9     {
10         this.name = name;
11         this.age = age;
12         this.university = university;
13         this.specialSkills = specialSkills;
14     }
15 
16     public String selfProduce()
17     {
18         return "我叫"+ name+",今年"+age+",毕业于"+university+",擅长于"+specialSkills+".";
19     }
20 }

客户端

 1 public class Client
 2 {
 3     @Test
 4     public void client()
 5     {
 6         Resume resume = new Resume("Tom","23","清华大学","并发编程");
 7         System.out.println(resume.selfProduce());
 8         
 9     }
10 }

如果我现在想把这份简历复印一份在这个基础上修改一下,根据不同的公司对于岗位的技能要求,只需要修改一下 specialSkills,显然我不能重新 new Resume(),因为里面的数据还要重新填,也不能直接在这份上面改,因为这份也要用,我就想复印一份跟它一样的。

示例代码

 1 class Resume implements Cloneable // 如果不实现这个接口就会报 cloneNotSupportExceptoin
 2 {
 3     private String name;
 4     private String age;
 5     private String university;
 6     private String specialSkills;
 7 
 8     public Resume()
 9     {
10         System.out.println("Resume 被初始化了");
11     }
12     
13     public Resume(String name, String age, String university, String specialSkills)
14     {
15         this.name = name;
16         this.age = age;
17         this.university = university;
18         this.specialSkills = specialSkills;
19         System.out.println("Resume 被初始化了hahaha");
20     }
21 
22     public String getSpecialSkills()
23     {
24         return specialSkills;
25     }
26 
27     public void setSpecialSkills(String specailSkills)
28     {
29         this.specialSkills = specailSkills;
30     }
31 
32     public String selfProduce()
33     {
34         return "我叫" + name + ",今年" + age + ",毕业于" + university + ",擅长于" + specialSkills + ".";
35     }
36 
37     public Resume clone()
38     {
39         Resume clone = null;
40         try
41         {
42             clone = (Resume) super.clone();
43         } catch (CloneNotSupportedException e)
44         {
45             e.printStackTrace();
46         }
47         return clone;
48     }
49 }

 客户端

 1 public class Client
 2 {
 3     @Test
 4     public void client()
 5     {
 6         Resume resume = new Resume("Tom", "23", "清华大学", "并发编程");
 7         System.out.println("这是原简历-----" + resume.selfProduce());
 8         Resume cloneResume = resume.clone();
 9         cloneResume.setSpecialSkills("分布式架构");
10         System.out.println("这是复印件-----" + cloneResume.selfProduce());
11     }
12 }

 运行结果

Resume 被初始化了hahaha
这是原简历-----我叫Tom,今年23,毕业于清华大学,擅长于并发编程. 这是复印件-----我叫Tom,今年23,毕业于清华大学,擅长于分布式架构.

 这就达到了我们的目的了。克隆本质上是:在堆中克隆出一块和原对象一样的对象,并将这个对象的地址赋予新的引用。

 Cloneable接口和Object的clone()方法

  Java中实现了Cloneable接口的类有很多,像我们熟悉的 ArrayList、Calendar、Date、HashMap、Hashtable、HashSet、LinkedList 等等。还是那句话,对于不熟悉的接口、方法,第一反应一定是查询 JDK API 。

1、Cloneable 接口

(1)一个类如果实现了 Cloneable 接口,就表示 Object 的 clone() 方法可以合法地对该类实例进行按字段复制

(2)如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone() 方法,则会导致抛出 CloneNotSupporteddException

(3)按照惯例,实现此接口的类应该使用公共方法重写 Object 的 clone() 方法,Object 的 clone() 方法是一个受保护的方法

2、Object 的 clone() 方法

创建并返回此对象的一个副本。对于任何对象 x,表达式:

(1)x.clone() != x 为 true

(2)x.clone().getClass() == x.getClass() 为 true

(3)x.clone().equals(x) 一般情况下为 true,但这并不是必须要满足的要求

public class Client
{@Testpublic void client(){Resume resume = new Resume("Tom", "23", "清华大学", "并发编程");Resume cloneResume = resume.clone();System.out.println(resume == cloneResume); // falseSystem.out.println(resume.getClass() == cloneResume.getClass()); // trueSystem.out.println(resume.equals(cloneResume)); // false
    }
}

运行结果

Resume 被初始化了hahaha
false
true
false

 第三个为 false 的原因是,这个对象的 equals 方法并没有重写,而是调用的是 Object 类的 equals 方法

public boolean equals(Object obj) 
{
return (this == obj); }

得到两个个结论:

1、克隆一个对象并不会调用对象的构造方法,因为 "Resume 被初始化了hahaha" 语句只出现了一次

2、符合JDK API的clone()方法三条规则

 

浅克隆和深克隆

 

 

转载于:https://www.cnblogs.com/tkzL/p/8782334.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring MVC:Ajax和JQuery

今天,我想演示如何将AJAX集成到Spring MVC应用程序中。 我将在客户端使用JQuery来发送请求和接收响应。 本教程将基于我以前关于Spring MVC和REST服务的教程之一。 在本文中,您将了解如何在异步请求的帮助下使Web应用程序更具交互性。 准备工作 我需要通…

C语言程序设计孙家啸第一版,广东年月自考各专业课程使用教材.doc

广东年月自考各专业课程使用教材附件2:广东2013年4月自考各专业课程使用教材序号课程代码课程名称使用教材作者出版社版次100009政治经济学(财经类)政治经济学(财经类)张雷声外语教学与研究出版社2012年版200012英语(一)大学英语自学教程(上册)高远高等教育出版社19…

手把手带你写一个JavaScript类型判断小工具

业务写了很多,依然不是前端大神,我相信这是很多‘入坑’前端开发同学的迷茫之处,个人觉得前端职业发展是有路径可寻的,前期写业务是一个积累过程,后期提炼总结,比如编程思想,父子类的原型继承&a…

【目录】《剑指Offer》Java实现

如题: 1) 找出数组中重复的数字 2) 不修改数组找出重复的数字 3) 二维数组中的查找 4) 替换空格 5) 从尾到头打印链表 6) 重建二叉树 7) 二叉树的下一个结点 8) 用两个栈实现队列 9) 斐波那契数列及青蛙跳台阶问题 10) 旋转数组的最小数字 11) 矩阵中的路…

yolov3之pytorch源码解析_springmvc源码架构解析之view

说在前面前期回顾sharding-jdbc源码解析 更新完毕spring源码解析 更新完毕spring-mvc源码解析 更新完毕spring-tx源码解析 更新完毕spring-boot源码解析 更新完毕rocketmq源码解析 更新完毕dubbbo源码解析 更新完毕netty源码解析 更新完毕spring源码架构更新完毕springmvc源码架…

Xstream将XML转换为javabean的问题

1.问题:Xstream is not security 解决方法:加上 2.问题:如果没有第二行代码,会出现xstream forbiddenclassexception 解决方法:加上第二行,其中参数是要进行解析的对象! 调用该方法:…

蚂蚁属性细微差别

每隔一段时间,我会想起Ant属性的一些细微差别 ,一旦忘记它们,在与Ant交互时会引起混乱。 特别是, Ant属性 通常是不可变的 (不包括Ant 1.8版本的 局部属性 ),并且在其首次设置时“永久”设置&am…

c语言约瑟夫环问题,C++_详解约瑟夫环问题及其相关的C语言算法实现,约瑟夫环问题 N个人围成一圈 - phpStudy...

详解约瑟夫环问题及其相关的C语言算法实现约瑟夫环问题N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。请按退出顺序输出每个退出人…

《从零构建前后分离的web项目》准备 - 前端了解过关了吗?

前端基础架构和硬核介绍 技术栈的选择 首先我们构建前端架构需要对前端生态圈有一切了解,并且最好带有一定的技术前瞻性,好的技术架构可能日后会方便的扩展,减少重构的次数,即使重构也不需要大动干戈,我通常选型技术栈…

联想w540笔记本参数_2020年12月笔记本电脑推荐!联想、惠普、华为笔记本电脑推荐!18款高性价比笔记本电脑推荐!!!...

前言&#xff1a;笔记本电脑&#xff0c;主要分为三种&#xff1a;轻薄本<全能本<游戏本。轻薄本&#xff0c;又称办公笔记本电脑&#xff0c;因为轻薄方便携带&#xff0c;通常用于移动办公使用。全能本&#xff0c;就是把轻薄本的集显变成了小独显&#xff0c;增加了独…

【BZOJ 1098】办公楼(补图连通块个数,Bfs)

补图连通块个数这大概是一个套路吧&#xff0c;我之前没有见到过&#xff0c;想了好久都没有想出来QaQ 事实上这个做法本身就是一个朴素算法&#xff0c;但进行巧妙的实现&#xff0c;就可以分析出它的上界不会超过 $O(n m)$。 接下来介绍一下这个技巧&#xff1a; 很显然一个…

Spring MVC:资源

我从博客读者那里收到的最常见的问题之一是如何在Spring MVC的应用程序中使用CSS和javascript文件。 因此&#xff0c;这是撰写有关Spring MVC中资源使用情况的文章的好机会。 通常&#xff0c;我将使用基于Java的配置方法。 如今&#xff0c;很难想象没有CSS和JavaScript文件…

map

头文件 首先要引入头文件 #include <map> . 并使用命名空间 using namespace std; 1、插入元素 用pair 或者 make_pair 均可&#xff0c;map键值不能重复。 map1.insert(pair<int,string>(123,"aaaaa")); //pair map1.insert(make_pair<int,string&…

c语言读文件空格间隔,c语言文件流实现按单个词读取(以空格、分号等作间隔)...

c语言文件流实现按词读取(以空格、分号等作间隔)1.基本描述在之前的作业中&#xff0c;认真编写代码&#xff0c;从中发现不少知识积累上的欠缺。编程中使用到的c语言文件读取&#xff0c;要求是按照获取到一个完整的词&#xff0c;并对其进行处理。写有java或c语言源程序的.tx…

山东专升本access知识点_全国各省份每年的专升本考试大纲啥时候公布?考纲公布之前你该做什么?...

?星标/置顶专升本招考下一个上岸的就是你最近小编在专升本招考后台收到很多同学的留言&#xff0c;大多同学都是看到好多省都公布了专升本考试政策和大纲&#xff0c;却迟迟不见自己所在的省份出&#xff0c;于是火急火燎地找到小编来问&#xff1a;XX省的考试大纲到底啥时候出…

2018091-2 博客作业

此作业的要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2101 1.建博客 在 cnblogs.com (博客园)建账号。博客地址&#xff1a;https://www.cnblogs.com/LY0503/ 2. 博客作业 &#xff08;1&#xff09;回想一下你曾经对计算机专业的畅想 当初你是如何做出选择…

观点|蚂蚁金服玉伯:我们是如何从前端技术进化到体验科技的?

小蚂蚁说&#xff1a;王保平&#xff0c;花名玉伯。熟悉前端和SeaJS的人一定对这个名字不陌生。作为前端领域的一枚大大大牛&#xff0c;他现在担任蚂蚁金服体验技术部负责人。本文&#xff0c;他分享了他从前端一路进阶升级到体验科技的个人思考&#xff0c;并详细介绍了体验科…

excel 电阻并联计算_电路分析基础(5)-关于电阻,有些话我还是要说一说

电阻定义&#xff1a;导体对电流的阻碍作用就叫该导体的电阻。不同的导体&#xff0c;电阻一般不同&#xff0c;电阻是导体本身的一种性质。定义式如下&#xff1a;因此&#xff0c;我们应该清楚了欧姆定律的本质到底是什么&#xff0c;为啥电阻跟电压和电流没有关系&#xff0…

针对新手的Java EE7和Maven项目–第2部分–为我们的应用程序定义一场简单的战争...

从第一部分恢复 第1部分 我们刚刚定义了父 pom。 一种特殊的pom类型&#xff0c;它最终定义了我们的应用程序将要使用的库。 它还配置了所有用于打包我们应用程序每个模块的Maven工具。 您可以在此处 签出 -1部分示例代码。 因此&#xff0c;到目前为止&#xff0c;在将要开发…

postman实现从response headers中获取cookie,并将其设置为环境变量

1.最近在学习postman的使用方法,为了保证后续模块操作&#xff0c;必须在登录时获取的session值&#xff0c;并将其设置为环境变量&#xff0c;session的位置处于response headers里面返回的set-cookie参数&#xff0c;并且将set-cookie中的session通过split方法截取出来. 写法…