Java对象clone()的测试
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()的测试的更多相关文章
- java对象clone
java克隆 为什么需要克隆 我们在很多时候需要使用一个对象去记录另外一个对象的当前状态,对象中可能会有很多属性,如果我们一个一个去设置,不仅不方便,而且效率很低,我们看一个初学者可能遇到的问题 cl ...
- GSON中Java对象与JSON互相转换——(一)
json的转换插件是通过java的一些工具,直接将java对象或集合转换成json字符串. 常用的json转换工具有如下几种: 1)jsonlib 2)Gson:google 3)fastjson:阿 ...
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么 ...
- java对象转json应clone,避免生成json串有问题
今天因为一个java对象转json,搞了我一下午,在些记录一下: 是这样:我在strtuts2的action中调用services返回 Row: 26, 中国银行海鹰, 29, 东楼, 36, 1F ...
- java克隆对象clone()的使用方法和作用
转自:997.html">http://www.okrs.cn/blog/news/?997.html 内容摘要 若需改动一个对象,同一时候不想改变调用者的对象.就要制作该对象的一个本 ...
- 测试json字符和java对象属性不一样在多个json框架下转换的表现
package com.longge.mytest; import java.io.IOException; import org.junit.Test; import com.alibaba.fas ...
- Java中clone方法的使用
什么是clone 在实际编程过程中,我们常常要遇到这种情况:有一个对象object1,在某一时刻object1中已经包含了一些有效值,此时可能会需要一个和object1完全相同新对象object2,并 ...
- Java对象的克隆和深浅问题
Java实现克隆的方式 Java实现克隆的方式有如下两种, 推荐采用实现Cloneable接口的方式 实现Cloneable接口, 重写clone方法, 调用父类的clone方法 还有另一种方法, 不 ...
- Java对象的序列化和反序列化源码阅读
前言 序列化和反序列化看起来用的不多,但用起来就很关键,因为稍一不注意就会出现问题.序列化的应用场景在哪里?当然是数据存储和传输.比如缓存,需要将对象复刻到硬盘存储,即使断电也可以重新反序列化恢复.下 ...
随机推荐
- 【转】Android hdpi ldpi mdpi xhdpi xxhdpi适配详解
1.了解几个概念(1)分辨率.分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800.720×1280.1080×1920等.720×1280表示此屏幕在宽 ...
- 002_浅析python 中__name__ = '__main__' 的作用
很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...
- CONTRO4 系列
软件下载 https://getcomposer.org/download/ 0技术手册 https://wenku.baidu.com/view/4b511ead376baf1ffd4fad36.h ...
- 在linux中查看进程占用的端口号
在Linux 上的 /etc/services 文件可以查看到更多关于保留端口的信息. 可以使用以下六种方法查看端口信息. ss:可以用于转储套接字统计信息. netstat:可以显示打开的套接字列表 ...
- linux防火墙开放和禁用指定端口
一.例如:开放8080端口 firewall-cmd --permanent --add-port=8080/tcp 二.重启使设置生效 systemctl restart firewalld.ser ...
- 最长上升子序列(LIS)
(我先扯些没用的) 我这个笨孩子 学点东西好慢好慢的 我还贪玩 于是 将自己陷入了一个超级超级超级差的境地 可 我还傻乎乎的保有着天真的梦想(理想?) 所以现在我要加倍的努力努力再努力了 只能嘎油了 ...
- Linux进程管理 (7)实时调度
关键词:RT.preempt_count.RT patch. 除了CFS调度器之外,还包括重要的实时调度器,有两种RR和FIFO调度策略.本章只是一个简单的介绍. 更详细的介绍参考<Linux进 ...
- Java多线程学习(二)---线程创建方式
线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...
- 下拉框选择blur与click冲突问题
缘由:今天在做下拉框选择时,遇到click和blur冲突问题:具体现象如下 1.intput框获取焦点(focus事件)时显示隐藏的下拉框,失去焦点(blur事件)则隐藏下拉框 2.点击选择(clic ...
- LeetCode 905. Sort Array By Parity
905. Sort Array By Parity Given an array A of non-negative integers, return an array consisting of a ...