以前也用过这个接口,那时是直接所有的东西都自己写了,也没发现问题。最近无意间发现这个接口的实现并不是想象中的那样,所以稍微研究了下,给大家分享一下。

步骤:1、建立两个简单的POJO:Teacher和Student

2、Teacher类实现了Cloneable接口,重写clone方法

3、在main方法中建立teacher,然后clone,比较teacher和clone出来的teacher

Teacher类:

public class Teacher implements Cloneable,Serializable{

private String name;

private String sex;

private int age;

private List list;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public List getList() {

return list;

}

public void setList(List list) {

this.list = list;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

protected Teacher clone() throws CloneNotSupportedException {

Teacher t = (Teacher)super.clone();

return t;

}

public Teacher deepClone() throws IOException, ClassNotFoundException

{

ByteArrayOutputStream out = new ByteArrayOutputStream();

ObjectOutputStream temp_out = new ObjectOutputStream(out);

temp_out.writeObject(this);

ByteArrayInputStream input = new ByteArrayInputStream(out.toByteArray());

ObjectInputStream temp_input = new ObjectInputStream(input);

return (Teacher) temp_input.readObject();

}

}

Student类:

public class Student implements Serializable{

private String stName;

private String stSex;

public String getStName() {

return stName;

}

public void setStName(String stName) {

this.stName = stName;

}

public String getStSex() {

return stSex;

}

public void setStSex(String stSex) {

this.stSex = stSex;

}

}

main:

public class MainTest {

public static void main(String[] args) throws CloneNotSupportedException, ClassNotFoundException, IOException {

List list = new ArrayList();

Student st = new Student();

st.setStName("stname");

st.setStSex("f");

list.add(st);

Teacher te = new Teacher();

te.setAge(19);

te.setList(list);

te.setName("tename");

te.setSex("tesex");

Teacher cl = te.clone();

cl.setAge(12);

System.out.println("淺複製"+ (cl == te));

//内存中的地址

System.out.println(cl.getName() == te.getName());

System.out.println(cl.getList() == te.getList());

System.out.println("source:"+te.getAge()+"<==>clone:"+cl.getAge());

Teacher  deep = te.deepClone();

System.out.println("深複製"+(cl == te));

System.out.println(deep.getName() == te.getName());

System.out.println(deep.getList() == te.getList());

}

}

输出结果:

淺複製false

true

true

source:19<==>clone:12

深複製false

false

false

从输出结果可以得出的结论:

1、对于浅复制来说,当调用clone方法返回的cl对象跟te对象不是同一个对象(地址不一样),但是内部的对象引用却是引用的相同对象(地址一样);而对于基本类型age(int)来说,克隆的对象cl跟原始对象te不是同一个(如果是同一个的话,修改任何一个,另外对象的内容也会变化)

2、对于深复制来说,克隆出来的对象不但跟原始对象不一样(地址不一样),而且内部应用对象也不一样了(地址不一样)

java cloneable_java.lang.Cloneable的理解相关推荐

  1. java cloneable_java开发——Cloneable接口、clone()方法和深浅拷贝

    1.实现Cloneable接口表明该类的对象是允许克隆的. 2.允许克隆的意思是:可以调用clone()方法. 3.深拷贝还是浅拷贝,取决于如何重写Object的clone()方法. 4.原对象和克隆 ...

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

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

  3. java的cloneable_Java的Cloneable接口和clone方法

    1. 克隆的用处 在日常编码中我们经常需要产生某个对象的副本,这里的副本并不是指向同一个对象的不同引用,而是与当前对象状态一模一样的另一个新的对象.如果使用单纯的引用赋值,会发生什么效果呢? 我们可以 ...

  4. Java虚拟机JVM简介与理解(三)

    Java虚拟机JVM简介与理解(三) 问题背景 PC程序计数器 虚拟机栈 本地方法栈 堆 元空间 方法区 运行时常量池 直接内存 Lyric: 彻底把我囚禁在你的呼吸 问题背景 Java虚拟机JVM简 ...

  5. JAVA 内存详解 (理解 JVM 如何使用 Windows 和 Linux 上的本机内存)

    级别: 中级 Andrew Hall , 软件工程师, IBM 2009 年 5 月 11 日 Java™ 堆耗尽并不是造成 java.lang.OutOfMemoryError 的惟一原因.如果本机 ...

  6. Java中的Cloneable接口

    1.Cloneable接口的作用 Cloneable是标记接口(其方法体为空),它用来表示一个类拥有某些希望具有的特征.实现Cloneable接口的类被标记为可克隆的,而且其对象可以使用Object类 ...

  7. Java虚拟机JVM简介与理解(一)

    Java虚拟机JVM简介与理解(一) 问题背景 JVM(Java Virtual Machine) Java虚拟机JVM简介与理解(二) Lyric: 擦干是否就看不见你 问题背景 Java虚拟机JV ...

  8. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

  9. 关于java多态中覆盖的理解

    在前面一篇文章中,我已经介绍了关于java多态中重载的理解与规则 所以这篇文章主要介绍多态中的覆盖机制. 首先重载与覆盖除了表现方式不同之外,还有运行时间上的不同,重载是在编译期间就已经可以确定好调用 ...

最新文章

  1. k8s 下线node正确处理姿势
  2. iView -- TimePicker 自定义修改时间选择器选择时间面板样式
  3. URAL 7077 Little Zu Chongzhi's Triangles(14广州I)
  4. 【StatLearn】统计学习中knn算法实验(2)
  5. ecshop /includes/init.php Arbitrary User Login Vul
  6. Erlang 之父去世,他留给程序员两点忠告
  7. 关于 printk() 对 spi slave 内核驱动程序的性能影响
  8. 程序人生之我们的故事:十年如歌(9)
  9. Linux中使用Msmtp+mutt+shell自动发邮件程序安装说明
  10. SpringBoot和Elasticsearch集成
  11. java 场景处理,最适合使用RxJava处理的四种场景
  12. sessionattribute 被spring 扫描不到_Spring 系列之 Spring 常用注解总结(肝硬化的干货)...
  13. 你会用JSON.stringify()?
  14. 正则表达式re中的group含义
  15. python扫描局域网端口和ip_Python实现扫描局域网活动ip(扫描在线电脑)
  16. java提取一个字符串中的整数和小数部分
  17. 10年经验总结:数据分析师7种工具,因果分析划重点!
  18. 基于云开发的查单词小程序设计 报告+PPT+项目源码+演示视频
  19. python快递分拣程序怎么写_分拣中心分拣作业流程
  20. 华为P40系列搭载HMS后,华为钱包很不错

热门文章

  1. 前端页面路由跳转方式详解
  2. 漂亮的aspx木马(root@shell)
  3. GRE阅读难句教程(一)
  4. 2021-09-25 WPF上位机 37-手写笔事件
  5. mysql 5.7.4 m14,windows下如何安装配置mysql-5.7-m14-winx64(zip格式的安装)
  6. Android:换肤
  7. 汽车销售行业如何做需求分析?​
  8. Linux 修改文件(文件夹)的权限 chown 与 chmod
  9. SORT、DeepSORT
  10. 电机控制需要学习哪些课程