Object中自带native clone()方法.

研究了一下用法.

 public class DeepCopyTest {

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

         test1();
System.out.println("-----------------------------");
test2(); } static void test1() throws CloneNotSupportedException {
Teacher t1 = new Teacher();
t1.settName("LaoLi"); Teacher t2 = new Teacher();
t2.settName("LaoWang"); Stu stu = new Stu();
stu.setName("name_1");
stu.setAge(23);
stu.setScore(129);
stu.setTeacher(t1); Stu stuCopy = stu.clone();
System.out.println("1:" + stu.toString());
System.out.println("2:" + stuCopy.toString()); stuCopy.setName("name_2");
stuCopy.setAge(25);
stuCopy.setScore(133);
stuCopy.setTeacher(t2); System.out.println("11:" + stu.toString());
System.out.println("22:" + stuCopy.toString()); } static void test2() throws CloneNotSupportedException {
Teacher t1 = new Teacher();
t1.settName("LaoLi"); Teacher t2 = new Teacher();
t2.settName("LaoWang"); Stu stu = new Stu();
stu.setName("name_1");
stu.setAge(23);
stu.setScore(129);
stu.setTeacher(t1); Stu stuCopy = stu.clone();
System.out.println("1:" + stu.toString());
System.out.println("2:" + stuCopy.toString()); stuCopy.setName("name_2");
stuCopy.setAge(25);
stuCopy.setScore(133);
stuCopy.getTeacher().settName("LaoKong"); System.out.println("11:" + stu.toString());
System.out.println("22:" + stuCopy.toString()); } } class Teacher {
private String tName; public String gettName() {
return tName;
} public void settName(String tName) {
this.tName = tName;
} @Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
} class Stu implements Cloneable {
private String name;
private int age;
private Integer score;
private Teacher teacher; public Teacher getTeacher() {
return teacher;
} public void setTeacher(Teacher teacher) {
this.teacher = teacher;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Integer getScore() {
return score;
} public void setScore(Integer score) {
this.score = score;
} public Stu clone() throws CloneNotSupportedException {
return (Stu) super.clone();
} @Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
} }

执行结果:

1:Stu[name=name_1,age=23,score=129,teacher=Teacher[tName=LaoLi]]
2:Stu[name=name_1,age=23,score=129,teacher=Teacher[tName=LaoLi]]
11:Stu[name=name_1,age=23,score=129,teacher=Teacher[tName=LaoLi]]
22:Stu[name=name_2,age=25,score=133,teacher=Teacher[tName=LaoWang]]
-----------------------------
1:Stu[name=name_1,age=23,score=129,teacher=Teacher[tName=LaoLi]]
2:Stu[name=name_1,age=23,score=129,teacher=Teacher[tName=LaoLi]]
11:Stu[name=name_1,age=23,score=129,teacher=Teacher[tName=LaoKong]]
22:Stu[name=name_2,age=25,score=133,teacher=Teacher[tName=LaoKong]]

基本验证了这样的结论:

基本类型,不变类型可以做到值拷贝效果.不变类型其实是引用发生了变化.

对象类型,实际上是引用拷贝.

设置一个新对象,stuCopy.getTeacher().setName("LaoKong")

引用其实发生了变化.-->指针A指向空间KK, 指针B也指向空间KK, 指针指向的地址KK中的内容替换掉.

而把对象重新设值, stuCopy.setTeacher(t2)

其实是把对象引用的地址指向新的对象. -->指针A指向空间KK, 指针B也指向空间KK, 指针BB指向新的空间KKK.

----------------------------------------------------

/* 浅复制 */
public Object clone() throws CloneNotSupportedException {
Prototype proto = (Prototype) super.clone();
return proto;
} /* 深复制 */
public Object deepClone() throws IOException, ClassNotFoundException { /* 写入当前对象的二进制流 */
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this); /* 读出二进制流产生的新对象 */
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}

Java对象clone()的测试的更多相关文章

  1. java对象clone

    java克隆 为什么需要克隆 我们在很多时候需要使用一个对象去记录另外一个对象的当前状态,对象中可能会有很多属性,如果我们一个一个去设置,不仅不方便,而且效率很低,我们看一个初学者可能遇到的问题 cl ...

  2. GSON中Java对象与JSON互相转换——(一)

    json的转换插件是通过java的一些工具,直接将java对象或集合转换成json字符串. 常用的json转换工具有如下几种: 1)jsonlib 2)Gson:google 3)fastjson:阿 ...

  3. Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

    Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么 ...

  4. java对象转json应clone,避免生成json串有问题

    今天因为一个java对象转json,搞了我一下午,在些记录一下: 是这样:我在strtuts2的action中调用services返回 Row: 26, 中国银行海鹰, 29, 东楼, 36, 1F ...

  5. java克隆对象clone()的使用方法和作用

    转自:997.html">http://www.okrs.cn/blog/news/?997.html 内容摘要 若需改动一个对象,同一时候不想改变调用者的对象.就要制作该对象的一个本 ...

  6. 测试json字符和java对象属性不一样在多个json框架下转换的表现

    package com.longge.mytest; import java.io.IOException; import org.junit.Test; import com.alibaba.fas ...

  7. Java中clone方法的使用

    什么是clone 在实际编程过程中,我们常常要遇到这种情况:有一个对象object1,在某一时刻object1中已经包含了一些有效值,此时可能会需要一个和object1完全相同新对象object2,并 ...

  8. Java对象的克隆和深浅问题

    Java实现克隆的方式 Java实现克隆的方式有如下两种, 推荐采用实现Cloneable接口的方式 实现Cloneable接口, 重写clone方法, 调用父类的clone方法 还有另一种方法, 不 ...

  9. Java对象的序列化和反序列化源码阅读

    前言 序列化和反序列化看起来用的不多,但用起来就很关键,因为稍一不注意就会出现问题.序列化的应用场景在哪里?当然是数据存储和传输.比如缓存,需要将对象复刻到硬盘存储,即使断电也可以重新反序列化恢复.下 ...

随机推荐

  1. esp8266 免费wifi强推广告神器(0) 项目介绍

    某宝产品 WIFI SSID广告终端路由推广宝 简单来说,手机连接免费wifi,自动弹出广告页面,有二维码和电话,点击电话直接打电话给商家客服,用户点击链接跳转到商家网页. 同时存在设置页面,使用者可 ...

  2. VS2015中配置Eigen

    Eigen非常方便矩阵操作,当然它的功能不止如此.矩阵操作在算法研究过程中,非常重要,例如在图像处理中二维高斯拟合求取光斑中心时使用Eigen提供的矩阵算法,差不多十来行代码即可实现. 1)下载Eig ...

  3. 解决 Vim 的 quickfix 插件错误信息乱码问题

      将以下代码插入 vim 配置文件即可,       function! QfMakeConv()        let qflist = getqflist()        for i in q ...

  4. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

  5. git pull 解决 refusing to merge unrelated histories 错误

    解决办法: 1.cmd进入项目的根目录. 2.执行下面的命令:git pull origin master --allow-unrelated-histories.可以提交成功. 3.再次push.

  6. 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!

    前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...

  7. Gradle构建工具从入门到精通(IDEA)

    1.Gradle安装 官网下载压缩包,然后解压,配置本地环境变量.主要有下面两个: GRADLE_HOME 是解压后的目录, GRADLE_USER_HOME 的作用是让其他程序检测到本地.gradl ...

  8. Python从菜鸟到高手(8):print函数、赋值与代码块

    1.神奇的print函数   print函数相信读者一定对它不陌生,因为在前面的章节,几乎每个例子都使用了print函数,这个函数的功能就是在控制台输出文本.不过print在输出文本时还可以进行一些设 ...

  9. 福州大学软件工程1816 | W班 第1次作业成绩排名

    1.作业地址 第一次作业--准备篇 2.作业要求 (1)回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的? 你认为过去两年中接触到的课程是否符合你对计算机专业的期待,为什 ...

  10. shell脚本使用记录一:操作文件

    一,连接远程数据库(保证在服务器上能使用mysql命令行,至少要安装mysql客户端) #!/bin/bash HOSTNAME="ip" PORT=" USERNAME ...