克隆clone() —> 使用clone()避免使用构造器生成对象。

重写clone()的原因:

  1. clone()本来的修饰符是protected,范围只是本类,本包和子类,范围不够大。在下面的例子中,CloneTest类中想使用其他类的clone()方法,不在本类,有时候不一定在本包,不是子类,改成public的修饰符方便在测试类或者其他类中调用。
  2. 在Object.clone()只是提供了浅层克隆,对于基本类型的字段,可以说它成功克隆了。但对于对象型字段,它并没有实现克隆的功能,仅仅把对象的引用复制了,如同下面的浅克隆的情况,所以含有对象类型的话要“定制”完成深度克隆。

未使用克隆的情况:

package Day07.Exercise.CloneTest;public class TestNoClone {public static void main(String[] args) {TestNoClone t1 = new TestNoClone();TestNoClone t2 = t1;System.out.println(t1);System.out.println(t2);System.out.println(t1==t2);}
}运行结果:
Day07.Exercise.CloneTest.Test@4554617c
Day07.Exercise.CloneTest.Test@4554617c
true

上面没有使用克隆,可以看到t1和t2的地址相同,引用t1和引用t2都指向堆内存的同一个地址。

使用浅克隆:

package Day07.Exercise.CloneTest;
public class Computer implements Cloneable{   // 实现接口private double height;private String brand;public Computer(double height, String brand) {this.height = height;this.brand = brand;}@Overridepublic Computer clone() throws CloneNotSupportedException {  // 重写克隆方法return (Computer)super.clone();}
}
package Day07.Exercise.CloneTest;public class Person implements Cloneable {  // 实现接口private String name;private int age;private Computer computer;public Person(String name, int age, Computer computer) {this.name = name;this.age = age;this.computer = computer;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", computer=" + computer +'}';}@Overrideprotected Person clone() throws CloneNotSupportedException {  // 重写克隆方法return (Person)super.clone();}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Computer getComputer() {return computer;}public void setComputer(Computer computer) {this.computer = computer;}
}
package Day07.Exercise.CloneTest;public class CloneTest {public static void main(String[] args) throws CloneNotSupportedException {Person person = new Person("小白",20,new Computer(200,"华为"));Person person1 = person.clone();System.out.println(person.toString());System.out.println(person1.toString());System.out.println(person==person1);System.out.println(person.getComputer()==person1.getComputer());}
}// 运行结果
Person{name='小白', age=20, computer=Day07.Exercise.CloneTest.Computer@4554617c}
Person{name='小白', age=20, computer=Day07.Exercise.CloneTest.Computer@4554617c}
false
true

上面使用浅克隆,可以看到person1和person2的内容相同,但是比较的结果是false,所以地址不同。但是引用person1和引用person2的属性Computer是引用类型,person1和引用person2的属性Computer指向的地址是相同的。所以只有浅克隆。

使用深克隆:

package Day07.Exercise.CloneTest;public class Computer implements Cloneable{   // 实现接口private double height;private String brand;public Computer(double height, String brand) {this.height = height;this.brand = brand;}@Overridepublic Computer clone() throws CloneNotSupportedException {  // 重写克隆方法return (Computer)super.clone();}}
package Day07.Exercise.CloneTest;public class Person implements Cloneable {    // 实现接口private String name;private int age;private Computer computer;public Person(String name, int age, Computer computer) {this.name = name;this.age = age;this.computer = computer;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", computer=" + computer +'}';}@Overridepublic Person clone() throws CloneNotSupportedException {  // 重写克隆方法Person p1 = (Person) super.clone();p1.setComputer(this.computer.clone());return p1;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Computer getComputer() {return computer;}public void setComputer(Computer computer) {this.computer = computer;}
}
package Day07.Exercise.CloneTest;public class CloneTest {public static void main(String[] args) throws CloneNotSupportedException {Person person = new Person("小白",20,new Computer(200,"华为"));Person person1 = person.clone();System.out.println(person.toString());System.out.println(person1.toString());System.out.println(person==person1);System.out.println(person.getComputer()==person1.getComputer());}
}// 运行结果:
Person{name='小白', age=20, computer=Day07.Exercise.CloneTest.Computer@4554617c}
Person{name='小白', age=20, computer=Day07.Exercise.CloneTest.Computer@74a14482}
false
false

上面使用深克隆,可以看到person1和person2的内容相同,但是比较的结果是false,所以地址不同。同时引用Computer1和引用Computer2比较的结果也是false,指向的地址是不同的。所以成功实现深克隆。

克隆clone() (Java)相关推荐

  1. Java克隆(Clone)的应用

    Java克隆(Clone)的应用 简介: Java克隆(Clone)是Java语言的特性之一,但在实际中应用比较少见.但有时候用克隆会更方便更有效率. 对于克隆(Clone),Java有一些限制: 1 ...

  2. Java 对象的克隆Clone和必须了解的浅拷贝与深拷贝

    前言 为什么要写这篇文章? 因为我最近无意间看到了一些项目的代码,不管是曾经编码的人还是新接手的人, 在想完全克隆复制一个已经存在的对象,做为后续的使用,竟然都是采取了重写new一个,然后一个个属性字 ...

  3. java强克隆_java之克隆clone解密

    为了理解java的clone,有必要先温习以下的知识. java的类型,java的类型分为两大类,一类为primitive,如int,另一类为引用类型,如String,Object等等. java引用 ...

  4. 对象克隆技术----Java常用类库

    文章目录 对象克隆技术----Java类库 前言 演示案例 运行结果 对象克隆技术----Java类库 前言 对象克隆技术即通过实现Cloneable接口和覆写Object类的clone方法实现,达到 ...

  5. 解决克隆clone github 仓库速度过慢的问题

    解决克隆clone GitHub 仓库速度过慢的问题 由于大家都懂的原因,我们访问GitHub的速度确实有点慢,特别是克隆比较大的仓库的时候,那速度简直无法直视. 今天我就给大家带来一个邪门歪道,不通 ...

  6. 【DB宝35】使用MySQL 8.0 克隆(clone)插件快速添加MGR节点

    文章目录 一.MySQL 8.0.17的克隆clone简介 二.MGR现有环境 三.使用clone技术添加MGR节点 3.1 初始化新节点 3.2 新节点安装clone插件和组复制插件 3.3 新节点 ...

  7. 克隆clone一个磁盘, diskgenius都做不出来,不能用,随便下载个AOMEI Partition Assistant还不错

    克隆clone一个磁盘, diskgenius都做不出来,不能用,随便下载个AOMEI Partition Assistant还不错 国产软件diskgenius太坑爹了, 技术不行就不要推出那个热克 ...

  8. Java浅克隆与深克隆区别详解与实现,以及String类型属性克隆为什么不受影响?克隆clone()方法中为什么是super.clone()

    1. 浅克隆实现 public class CloneTest {public static void main(String[] args) throws CloneNotSupportedExce ...

  9. java cloneable_JAVA基础 对象克隆 实现java.lang.Cloneable接口

    先来看看JDK的解释: java.lang.Cloneable A class implements the Cloneable interface to indicate to the java.l ...

最新文章

  1. Python 字典(Dictionary) copy()方法
  2. 测试一下能够图文混排
  3. GDCM:gdcm::String的测试程序
  4. linux系统数据落盘之细节
  5. PHP 正则表达式分割 preg_split 与 split 函数
  6. 【C#】【引用加原创】C#实现kalman滤波
  7. Guns根据条件查询数据_入门试炼04
  8. 如何在 Exchange Server 2010 SP1 下将用户邮箱导出到PST中
  9. 设计模式1【续】:动态设定行为
  10. 材料模拟计算机,材料计算机模拟技术
  11. 单片机c语言 课程设计报告,单片机课程设计心得体会精选
  12. 数据总线、地址总线详解
  13. 简单几步实现Ubuntu22.04启用Nvidia显卡
  14. 手机变速齿轮_手机app变速齿轮
  15. 云服务器到底是什么?云服务器的优势有哪些
  16. SAR+L波段+森林生物量估计+高度反演
  17. Webpack 安装
  18. 利用opencv带你玩转人脸识别-下篇(人脸录入,数据训练,人脸识别小案例快速入门)
  19. 爬取动漫美女,手把手教你用Python网络爬虫获取动漫图片
  20. ECU存储安全之深入理解Flash

热门文章

  1. 【2017-02-05】【前端】百度贴吧免登陆查看评论,翻页等
  2. 微信小程序--sha1加密元素以字典顺序排序微信小程序接入微信公众平台
  3. do...while(0)的妙用[转自:http://www.yuanma.org/data/2007/0209/article_2271.htm]
  4. FreeSwitch的docker部署
  5. 由浅入深,谈谈文件上传的优化思路
  6. hpgen8服务器修改电源模式,用HP GEN8+WIN2012+Hyper V+黑群晖5.2组建家庭NAS中心 篇二:HP GEN8硬件改造...
  7. c51随机数不重复_C51学习心得体会,产生随机数
  8. 手机端python ide_Python IDE 测评
  9. JPA - Persistence与EntityManagerFactory
  10. oracle 动态声明变量_oracle存储过程动态sql变量赋值