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()相关推荐

  1. JAVA与C++的区别详解

    转自:微点阅读  https://www.weidianyuedu.com JAVA和C++都是面向对象语言.也就是说,它都能够实现面向对象思想(封装,继乘,多态).而由于c++为了照顾大量的C语言使 ...

  2. java之yield(),sleep(),wait()区别详解-备忘笔记

    java之yield(),sleep(),wait()区别详解-备忘笔记 1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如 ...

  3. Java构造器(构造方法)详解

    Java构造器(构造方法)详解 什么是构造器 构造器通常也叫构造方法.构造函数,构造器在每个项目中几乎无处不在.当你new一个对象时,就会调用构造器.构造器格式如下: [修饰符,比如public] 类 ...

  4. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  5. Java中print、printf、println的区别 详解

    Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...

  6. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  7. 深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    转载自  深入Synchronized和java.util.concurrent.locks.Lock的区别详解 本篇文章是对Synchronized和java.util.concurrent.loc ...

  8. java中$和 的区别详解_Mybatis之#{}与${}的区别使用详解

    1.两种取值方式的差异 mapper.xml映射文件 select * from t_emp WHERE emp_id=${id} and emp_name=#{name} java查询代码 para ...

  9. throws java_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

最新文章

  1. 2013年阿里巴巴暑期实习招聘笔试题目(转)
  2. python读写json文件
  3. 精选Spring Boot三十五道必知必会知识点!
  4. ks minidriver 开发总结
  5. 新浪微博杨卫华 PHP,构建高性能的微博系统——再谈新浪微博架构_杨卫华.pdf
  6. Debug时如何跳过(不执行)某些代码
  7. 【转载】C#中List集合使用Exists方法判断是否存在符合条件的元素对象
  8. 修改/etc/resolv.conf又恢复到原来的状态?[转]
  9. Linux SVN 服务器配置以及客户端使用
  10. rust怎么建柱子_小报:捷达VS5安全带卡扣向里?敲B柱?怎么掰回来? 第191220期...
  11. Entity Framework 与 面向对象
  12. BZOJ 1078: [SCOI2008]斜堆
  13. dell 恢复介质_Dell Backup and Recovery 1.8:出厂恢复介质
  14. 六度空间 c语言 【详解】
  15. jena java,Apache Jena Java工具箱
  16. 如何缓解百度网盘限速问题
  17. java读取tiff图像的像素值
  18. Linux 对命令起别名
  19. 服务器显示屏 超出工作频率范围,WIN7电脑显示器超出工作频率范围的处理方法...
  20. LDA主题模型及python实现

热门文章

  1. 平底方向盘比圆形方向盘好在哪?
  2. 欧锦赛球星谱:帕克领豪阵 诺天王对决加索尔
  3. 不论我们爱或者不爱,我们为什么选择SAP?
  4. 物料分类账的基本原理
  5. 现金流量表的内容和结构
  6. SAP同一公司不同工厂间物料转储方案比较
  7. 疫情下跨境电商逆势增长,大数据告诉你如何抓住跨境网购新趋势
  8. 买走5355.5万张床垫的年轻人,实现“深睡自由”了吗?
  9. X会员“圈养”长沙胃,盒马鲜生“有备而来”的会员制
  10. 波司登在“寒潮”下再创新高,羽绒服行业真的靠天吃饭?