java cloneable_java.lang.Cloneable的理解
以前也用过这个接口,那时是直接所有的东西都自己写了,也没发现问题。最近无意间发现这个接口的实现并不是想象中的那样,所以稍微研究了下,给大家分享一下。
步骤: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的理解相关推荐
- java cloneable_java开发——Cloneable接口、clone()方法和深浅拷贝
1.实现Cloneable接口表明该类的对象是允许克隆的. 2.允许克隆的意思是:可以调用clone()方法. 3.深拷贝还是浅拷贝,取决于如何重写Object的clone()方法. 4.原对象和克隆 ...
- java cloneable_JAVA基础 对象克隆 实现java.lang.Cloneable接口
先来看看JDK的解释: java.lang.Cloneable A class implements the Cloneable interface to indicate to the java.l ...
- java的cloneable_Java的Cloneable接口和clone方法
1. 克隆的用处 在日常编码中我们经常需要产生某个对象的副本,这里的副本并不是指向同一个对象的不同引用,而是与当前对象状态一模一样的另一个新的对象.如果使用单纯的引用赋值,会发生什么效果呢? 我们可以 ...
- Java虚拟机JVM简介与理解(三)
Java虚拟机JVM简介与理解(三) 问题背景 PC程序计数器 虚拟机栈 本地方法栈 堆 元空间 方法区 运行时常量池 直接内存 Lyric: 彻底把我囚禁在你的呼吸 问题背景 Java虚拟机JVM简 ...
- JAVA 内存详解 (理解 JVM 如何使用 Windows 和 Linux 上的本机内存)
级别: 中级 Andrew Hall , 软件工程师, IBM 2009 年 5 月 11 日 Java™ 堆耗尽并不是造成 java.lang.OutOfMemoryError 的惟一原因.如果本机 ...
- Java中的Cloneable接口
1.Cloneable接口的作用 Cloneable是标记接口(其方法体为空),它用来表示一个类拥有某些希望具有的特征.实现Cloneable接口的类被标记为可克隆的,而且其对象可以使用Object类 ...
- Java虚拟机JVM简介与理解(一)
Java虚拟机JVM简介与理解(一) 问题背景 JVM(Java Virtual Machine) Java虚拟机JVM简介与理解(二) Lyric: 擦干是否就看不见你 问题背景 Java虚拟机JV ...
- python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...
Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...
- 关于java多态中覆盖的理解
在前面一篇文章中,我已经介绍了关于java多态中重载的理解与规则 所以这篇文章主要介绍多态中的覆盖机制. 首先重载与覆盖除了表现方式不同之外,还有运行时间上的不同,重载是在编译期间就已经可以确定好调用 ...
最新文章
- k8s 下线node正确处理姿势
- iView -- TimePicker 自定义修改时间选择器选择时间面板样式
- URAL 7077 Little Zu Chongzhi's Triangles(14广州I)
- 【StatLearn】统计学习中knn算法实验(2)
- ecshop /includes/init.php Arbitrary User Login Vul
- Erlang 之父去世,他留给程序员两点忠告
- 关于 printk() 对 spi slave 内核驱动程序的性能影响
- 程序人生之我们的故事:十年如歌(9)
- Linux中使用Msmtp+mutt+shell自动发邮件程序安装说明
- SpringBoot和Elasticsearch集成
- java 场景处理,最适合使用RxJava处理的四种场景
- sessionattribute 被spring 扫描不到_Spring 系列之 Spring 常用注解总结(肝硬化的干货)...
- 你会用JSON.stringify()?
- 正则表达式re中的group含义
- python扫描局域网端口和ip_Python实现扫描局域网活动ip(扫描在线电脑)
- java提取一个字符串中的整数和小数部分
- 10年经验总结:数据分析师7种工具,因果分析划重点!
- 基于云开发的查单词小程序设计 报告+PPT+项目源码+演示视频
- python快递分拣程序怎么写_分拣中心分拣作业流程
- 华为P40系列搭载HMS后,华为钱包很不错