java cloneable_java.lang.Cloneable的理解「建议收藏」

java cloneable_java.lang.Cloneable的理解「建议收藏」以前也用过这个接口,那时是直接所有的东西都自己写了,也没发现问题。最近无意间发现这个接口的实现并不是想象中的那样,所以稍微研究了下,给大家分享一下。步骤:1、建立两个简单的POJO:Teacher和Student2、Teacher类实现了Cloneable接口,重写clone方法3、在main方法中建立teacher,然后clone,比较teacher和clone出来的teacherTeacher…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

步骤: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、对于深复制来说,克隆出来的对象不但跟原始对象不一样(地址不一样),而且内部应用对象也不一样了(地址不一样)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181928.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mongodb菜鸟教程_mongodb怎么用

    mongodb菜鸟教程_mongodb怎么用MongoVUE是一个关于mongodb数据库管理的工具,并且免费,但超过15天后功能受限。我们可以通过删除mongodb相应的注册表项来解除限制。其步骤如下:1.运行‘win+R’;2.输入‘regedit’,如下图所示:3.进入注册表编辑器,找到与mongodb相关的注册表项,并将里面的注册表项全部删除,如下所示:4.最后可以发现mongovue可以正常使用了,mongovue被激活成功教程了。5.细…

    2022年8月21日
    11
  • oracle12官方下载,Oracle 12c下载64位|Oracle Database 12c下载 官方版_最火软件站[通俗易懂]

    oracle12官方下载,Oracle 12c下载64位|Oracle Database 12c下载 官方版_最火软件站[通俗易懂]Oracle12C是由Oracle官方提供的最新版本数据库,Oracle12C引入了CDB与PDB的新特性,在ORACLE12C数据库引入的多租用户环境(MultitenantEnvironment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为ContainerDatabase,中文翻译为数据库容器,PDB全称为PluggableDatabase,即可…

    2025年7月8日
    4
  • H264编码流程_h265和h265+视频编码有什么差别

    H264编码流程_h265和h265+视频编码有什么差别H264编码流程手绘图:H264编码网上图:

    2025年8月9日
    2
  • python发邮件详解,smtplib和email模块详解

    python发邮件详解,smtplib和email模块详解在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理。SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式,python实现发邮件也是基于此基础上进行封装的。1.python发邮件所需要的基础包python发送邮件需要用到python自带的两个模块,s…

    2025年8月7日
    3
  • busybox引导linux内核_linux移植教程

    busybox引导linux内核_linux移植教程文章目录一、搭建NFS服务器二、使用BusyBox构建跟文件系统2.1修改顶层Makefile2.2busybox中文支持2.3配置busybox2.4编译busybox2.5向根文件系统添加lib库2.5.1向{rootfs}/lib目录下添加库文件2.5.2向{rootfs}/usr/lib目录下添加库文件2.6创建其他文件夹三、测试文件系统(NFS挂载)3.1设置uboot中环境变量3.2命令解析四、完善文件系统4.1创建{rootfs}/etc/init.d/rcS文件4.2

    2022年10月6日
    2
  • jetson tx1 配置SSD固态硬盘「建议收藏」

    jetson tx1 配置SSD固态硬盘「建议收藏」转载自:http://blog.csdn.net/hit2015spring/article/details/62217289配置外置SSD这里用的是三星EVO250G的SSD,支持SATA接口,ssd插上去开机是不能用的,TX1是没有识别的,需要的格式化为Linux支持的文件系统ext4.一系列配置之后可以把ssd设置为外置的存储,然后再把文件系统拷贝到SSD

    2022年6月29日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号