克隆clone() (Java)
克隆clone() —> 使用clone()避免使用构造器生成对象。
重写clone()的原因:
- clone()本来的修饰符是protected,范围只是本类,本包和子类,范围不够大。在下面的例子中,CloneTest类中想使用其他类的clone()方法,不在本类,有时候不一定在本包,不是子类,改成public的修饰符方便在测试类或者其他类中调用。
- 在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)相关推荐
- Java克隆(Clone)的应用
Java克隆(Clone)的应用 简介: Java克隆(Clone)是Java语言的特性之一,但在实际中应用比较少见.但有时候用克隆会更方便更有效率. 对于克隆(Clone),Java有一些限制: 1 ...
- Java 对象的克隆Clone和必须了解的浅拷贝与深拷贝
前言 为什么要写这篇文章? 因为我最近无意间看到了一些项目的代码,不管是曾经编码的人还是新接手的人, 在想完全克隆复制一个已经存在的对象,做为后续的使用,竟然都是采取了重写new一个,然后一个个属性字 ...
- java强克隆_java之克隆clone解密
为了理解java的clone,有必要先温习以下的知识. java的类型,java的类型分为两大类,一类为primitive,如int,另一类为引用类型,如String,Object等等. java引用 ...
- 对象克隆技术----Java常用类库
文章目录 对象克隆技术----Java类库 前言 演示案例 运行结果 对象克隆技术----Java类库 前言 对象克隆技术即通过实现Cloneable接口和覆写Object类的clone方法实现,达到 ...
- 解决克隆clone github 仓库速度过慢的问题
解决克隆clone GitHub 仓库速度过慢的问题 由于大家都懂的原因,我们访问GitHub的速度确实有点慢,特别是克隆比较大的仓库的时候,那速度简直无法直视. 今天我就给大家带来一个邪门歪道,不通 ...
- 【DB宝35】使用MySQL 8.0 克隆(clone)插件快速添加MGR节点
文章目录 一.MySQL 8.0.17的克隆clone简介 二.MGR现有环境 三.使用clone技术添加MGR节点 3.1 初始化新节点 3.2 新节点安装clone插件和组复制插件 3.3 新节点 ...
- 克隆clone一个磁盘, diskgenius都做不出来,不能用,随便下载个AOMEI Partition Assistant还不错
克隆clone一个磁盘, diskgenius都做不出来,不能用,随便下载个AOMEI Partition Assistant还不错 国产软件diskgenius太坑爹了, 技术不行就不要推出那个热克 ...
- Java浅克隆与深克隆区别详解与实现,以及String类型属性克隆为什么不受影响?克隆clone()方法中为什么是super.clone()
1. 浅克隆实现 public class CloneTest {public static void main(String[] args) throws CloneNotSupportedExce ...
- java cloneable_JAVA基础 对象克隆 实现java.lang.Cloneable接口
先来看看JDK的解释: java.lang.Cloneable A class implements the Cloneable interface to indicate to the java.l ...
最新文章
- Python 字典(Dictionary) copy()方法
- 测试一下能够图文混排
- GDCM:gdcm::String的测试程序
- linux系统数据落盘之细节
- PHP 正则表达式分割 preg_split 与 split 函数
- 【C#】【引用加原创】C#实现kalman滤波
- Guns根据条件查询数据_入门试炼04
- 如何在 Exchange Server 2010 SP1 下将用户邮箱导出到PST中
- 设计模式1【续】:动态设定行为
- 材料模拟计算机,材料计算机模拟技术
- 单片机c语言 课程设计报告,单片机课程设计心得体会精选
- 数据总线、地址总线详解
- 简单几步实现Ubuntu22.04启用Nvidia显卡
- 手机变速齿轮_手机app变速齿轮
- 云服务器到底是什么?云服务器的优势有哪些
- SAR+L波段+森林生物量估计+高度反演
- Webpack 安装
- 利用opencv带你玩转人脸识别-下篇(人脸录入,数据训练,人脸识别小案例快速入门)
- 爬取动漫美女,手把手教你用Python网络爬虫获取动漫图片
- ECU存储安全之深入理解Flash
热门文章
- 【2017-02-05】【前端】百度贴吧免登陆查看评论,翻页等
- 微信小程序--sha1加密元素以字典顺序排序微信小程序接入微信公众平台
- do...while(0)的妙用[转自:http://www.yuanma.org/data/2007/0209/article_2271.htm]
- FreeSwitch的docker部署
- 由浅入深,谈谈文件上传的优化思路
- hpgen8服务器修改电源模式,用HP GEN8+WIN2012+Hyper V+黑群晖5.2组建家庭NAS中心 篇二:HP GEN8硬件改造...
- c51随机数不重复_C51学习心得体会,产生随机数
- 手机端python ide_Python IDE 测评
- JPA - Persistence与EntityManagerFactory
- oracle 动态声明变量_oracle存储过程动态sql变量赋值