Java浅克隆与深克隆区别详解与实现,以及String类型属性克隆为什么不受影响?克隆clone()方法中为什么是super.clone()
1. 浅克隆实现
public class CloneTest {public static void main(String[] args) throws CloneNotSupportedException {Student s = new Student(18, new String("lhj"), new Hobby("ping-pang"));Student s1 = s.clone();System.out.println(s);System.out.println(s1);s1.age = 19;s1.name = new String("lkj");s1.hobby.hobby1 = new String("basketball");System.out.println("修改后========");System.out.println(s);System.out.println(s1);}
}// 实现Cloneable接口
class Student implements Cloneable{int age;String name;Hobby hobby;Student(int age, String name, Hobby hobby){this.age = age;this.name = name;this.hobby = hobby;}@Overridepublic Student clone() throws CloneNotSupportedException {return (Student) super.clone(); // 调用父类的clone方法,直至调用Object.clone()方法实现对象的复制}@Overridepublic String toString() {return "Student{" + "age=" + age + ", name='" + name + '\'' + ", hobby=" + hobby + '}';}
}class Hobby{String hobby1;Hobby(String hobby){this.hobby1 = hobby;}@Overridepublic String toString() {return "Hobby{" + "hobby1='" + hobby1 + '\'' + '}';}
}
2. 深克隆实现
public class CloneTest {public static void main(String[] args) throws CloneNotSupportedException {Student s = new Student(18, new String("lhj"), new Hobby("ping-pang"));Student s1 = s.clone();System.out.println(s);System.out.println(s1);s1.age = 19;s1.name = new String("lkj");s1.hobby.hobby1 = new String("basketball");System.out.println("修改后========");System.out.println(s);System.out.println(s1);}
}class Student implements Cloneable{int age;String name;Hobby hobby;Student(int age, String name, Hobby hobby){this.age = age;this.name = name;this.hobby = hobby;}/*** 改写的clone方法*/@Overridepublic Student clone() throws CloneNotSupportedException{Student tmp = (Student) super.clone();tmp.hobby = hobby.clone();return tmp;}@Overridepublic String toString() {return "Student{" + "age=" + age + ", name='" + name + '\'' + ", hobby=" + hobby + '}';}
}class Hobby implements Cloneable{String hobby1;Hobby(String hobby){this.hobby1 = hobby;}/*** 新增加的clone方法*/@Overridepublic Hobby clone() throws CloneNotSupportedException {return (Hobby) super.clone();}@Overridepublic String toString() {return "Hobby{" + "hobby1='" + hobby1 + '\'' + '}';}
}
3. 浅克隆和深克隆的区别
3.1 浅克隆:克隆后,修改克隆对象或原对象的基本类型和String类型属性,不会影响另一个对象,但是修改其它引用类型属性,则会影响另一个对象。深克隆:克隆后,克隆对象和原对象之间没有关联,修改某个对象不会影响另一个对象。
3.2 浅克隆的String类型属性之所以不受另一个对象的改变而影响,是因为String类型是不可修改的,也就无法操作,也就不会受到另一个对象操作的影响。
3.3 浅克隆的引用类型属性会受到另一个对象的改变而影响,是因为它们共用一个引用对象,那么引用对象更改,会影响另一个对象,所以我们在克隆时,需要把引用类型属性也克隆一份,这样就不会互相干扰,最终实现深克隆。
Java浅克隆与深克隆区别详解与实现,以及String类型属性克隆为什么不受影响?克隆clone()方法中为什么是super.clone()相关推荐
- JAVA与C++的区别详解
转自:微点阅读 https://www.weidianyuedu.com JAVA和C++都是面向对象语言.也就是说,它都能够实现面向对象思想(封装,继乘,多态).而由于c++为了照顾大量的C语言使 ...
- java之yield(),sleep(),wait()区别详解-备忘笔记
java之yield(),sleep(),wait()区别详解-备忘笔记 1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如 ...
- Java构造器(构造方法)详解
Java构造器(构造方法)详解 什么是构造器 构造器通常也叫构造方法.构造函数,构造器在每个项目中几乎无处不在.当你new一个对象时,就会调用构造器.构造器格式如下: [修饰符,比如public] 类 ...
- java mod %区别_Java中 % 与Math.floorMod() 区别详解
%为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...
- Java中print、printf、println的区别 详解
Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...
- java throw与throws_基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- 深入Synchronized和java.util.concurrent.locks.Lock的区别详解
转载自 深入Synchronized和java.util.concurrent.locks.Lock的区别详解 本篇文章是对Synchronized和java.util.concurrent.loc ...
- java中$和 的区别详解_Mybatis之#{}与${}的区别使用详解
1.两种取值方式的差异 mapper.xml映射文件 select * from t_emp WHERE emp_id=${id} and emp_name=#{name} java查询代码 para ...
- throws java_基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
最新文章
- 2013年阿里巴巴暑期实习招聘笔试题目(转)
- python读写json文件
- 精选Spring Boot三十五道必知必会知识点!
- ks minidriver 开发总结
- 新浪微博杨卫华 PHP,构建高性能的微博系统——再谈新浪微博架构_杨卫华.pdf
- Debug时如何跳过(不执行)某些代码
- 【转载】C#中List集合使用Exists方法判断是否存在符合条件的元素对象
- 修改/etc/resolv.conf又恢复到原来的状态?[转]
- Linux SVN 服务器配置以及客户端使用
- rust怎么建柱子_小报:捷达VS5安全带卡扣向里?敲B柱?怎么掰回来? 第191220期...
- Entity Framework 与 面向对象
- BZOJ 1078: [SCOI2008]斜堆
- dell 恢复介质_Dell Backup and Recovery 1.8:出厂恢复介质
- 六度空间 c语言 【详解】
- jena java,Apache Jena Java工具箱
- 如何缓解百度网盘限速问题
- java读取tiff图像的像素值
- Linux 对命令起别名
- 服务器显示屏 超出工作频率范围,WIN7电脑显示器超出工作频率范围的处理方法...
- LDA主题模型及python实现
热门文章
- 平底方向盘比圆形方向盘好在哪?
- 欧锦赛球星谱:帕克领豪阵 诺天王对决加索尔
- 不论我们爱或者不爱,我们为什么选择SAP?
- 物料分类账的基本原理
- 现金流量表的内容和结构
- SAP同一公司不同工厂间物料转储方案比较
- 疫情下跨境电商逆势增长,大数据告诉你如何抓住跨境网购新趋势
- 买走5355.5万张床垫的年轻人,实现“深睡自由”了吗?
- X会员“圈养”长沙胃,盒马鲜生“有备而来”的会员制
- 波司登在“寒潮”下再创新高,羽绒服行业真的靠天吃饭?