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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python中的encode()和decode()函数

    python中的encode()和decode()函数对于很多人来说,python的中字符转码是一件很头疼的事情,本来期望结果输出的是中文,结果来一段像这样\xe4\xbd\xa0\xe5\xa5\xbd像是乱码的字符串。由于学python没多久,昨天使用python的时候,就遇到这种问题,现在来深入研究下与之相关的encode()和decode()函数,和如何把如乱码般的字符串转成中文。encode()和decode()都是字符串的函数,可直接查看关

    2022年10月7日
    0
  • c++中数组下标越界输出什么_C语言数组的越界和溢出

    c++中数组下标越界输出什么_C语言数组的越界和溢出引言最近突然想到当数组array有2个元素,而访问其array[2]时会不会编译错误的问题,答案是编译的时候不报错,只有运行的时候才报错。感悟以下是我测试用的代码,程序可以正常编译,且编译正确,只是在运行的时候出现程序崩溃。chararray[2]={‘2′,’3’};std::cout<<array[2]<<std::endl;//编译正常,运行的时候出现问题基于上述现象,说明程序在编译的时候没有进行下标越界的检查,当一个程序生成可执行文件的时候

    2022年10月2日
    0
  • <!DOCTYPE html PUBLIC……>的组成解释「建议收藏」

    <!DOCTYPE html PUBLIC……>的组成解释「建议收藏」DOCTYPE是documenttype(文档类型)的简写,在web设计中用来说明你用的XHTML或者HTML是什么版本。要建立符合标准的网页,DOCTYPE声明是必不可少的关键组成部分;除非你的XHTML确定了一个正确的DOCTYPE,否则你的标识和CSS都不会生效。DOCTYPE声明开始制作符合标准的站点,第一件事情就是声明符合自己需要的DOCTYPE。查看很多使用XHTML

    2022年7月12日
    14
  • sublime 4121 激活码【最新永久激活】「建议收藏」

    (sublime 4121 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月31日
    326
  • 【期末复习】微机原理与接口技术

    【期末复习】微机原理与接口技术知识重点整理第一章输入/输出系统1.接口电路的作用和基本功能接口电路是CPU与外设交换信息的中转站。接口电路应具备的功能为:数据缓冲功能、联络功能、寻址功能、数据转换功能、中断管理功能。2.端口的概念和分类端口是接口电路中能与CPU直接进行信息交换的寄存器,即I/O端口寄存器。在接口电路中,按端口寄存器存放信息的物理意义可划分为数据端口、控制端口和状态端口:数据端…

    2022年10月2日
    0
  • 百度PCS快速获取access_token的方法

    百度PCS快速获取access_token的方法

    2021年8月26日
    53

发表回复

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

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