关于Java深clone 的例子学习
之前http://www.cnblogs.com/lhppom/p/4857702.html里有提到关于Java的深克隆的学习,深浅区别就是在于仅复制对象引用和复制对象引用所指向的对象,最近在看《Java核心技术卷1》时,看到其中一个克隆的例子,这里再做个补充,其实现克隆的方式就是将对象中除数值或基本类以外的域再进行克隆,然后将引用给到新克隆的对象中所对应的域;
public class Pet implements Cloneable{
String name;
public Pet(String name){
this.name = name;
}
public void setName(String name){
this.name = name;
}
public String toString(){
return "its name is "+name;
}
public Pet clone(){
try {
return (Pet) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
Pet类
public class Man implements Cloneable{
String name;
int age;
Pet pet;
public Man(String name, int age, Pet pet) {
this.name = name;
this.age = age;
this.pet = pet;
}
public Man clone() {
Man m;
Pet p;
try {
m = (Man) super.clone();
p = (Pet) this.pet.clone();
m.pet = p;
return m;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public String toString() {
return "the man named " + name + " who is " + age
+ " years old owns the pet which " + pet.toString();
}
}
Man类
public class Woman implements Cloneable {
String name;
int age;
Pet pet;
public Woman(String name, int age, Pet pet) {
this.name = name;
this.age = age;
this.pet = pet;
}
public Object clone() {
Object o;
try {
o = super.clone();
return o;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public String toString() {
return "the woman named " + name + " who is " + age
+ " years old owns the pet which " + pet.toString();
}
}
Woman类
public class CloneCompareTest {
public static void main(String[] args) {
Pet p = new Pet("jack");
Woman w1 = new Woman("marry",21,p);
Woman w2 = (Woman)w1.clone();
w2.pet.setName("tom");
System.out.println("w1: "+w1.toString());
System.out.println("w2: "+w2.toString());
Pet p1 = new Pet("michal");
Man m1= new Man("jack",32,p1);
Man m2 = m1.clone();
m2.pet.setName("gary");
System.out.println("m1: "+m1.toString());
System.out.println("m2: "+m2.toString());
}
}
深浅克隆的异同测试类
在测试结果中,我们可以看到的确是实现了深克隆的效果:
w1: the woman named marry who is 21 years old owns the pet which its name is tom
w2: the woman named marry who is 21 years old owns the pet which its name is tom
m1: the man named jack who is 32 years old owns the pet which its name is michal
m2: the man named jack who is 32 years old owns the pet which its name is gary
关于Java深clone 的例子学习的更多相关文章
- java 深clone和浅clone
1. clone类 public class Person implements Cloneable, Serializable{ /** * */ private static final long ...
- 分析java中clone()方法 (转载+修改)
Java中的clone() 方法 java所有的类都是从java.lang.Object类继承而来的,而Object类提供下面的方法对对象进行复制. protected native Object c ...
- 20155322 2016-2017-2 《Java程序设计》 第一周学习总结
20155322 2016-2017-2 <Java程序设计> 第一周学习总结 教材学习内容总结 本周学习内容的主要是: 一.浏览教材,根据自己的理解每章提出一个问题. 在浏览教材后,我提 ...
- 数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇
HT 是啥:Everything you need to create cutting-edge 2D and 3D visualization. 这口号是当年心目中的产品方向,接着就朝这个方向慢慢打 ...
- Java并发包源码学习之AQS框架(三)LockSupport和interrupt
接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...
- 20145213《Java程序设计》第四周学习总结
20145213<Java程序设计>第四周学习总结 教材学习内容总结 本周任务是学习面向对象的继承.接口以及之后的如何活用多态.(还真是路漫漫其修远兮啊!)教材也是延续上周艰深晦涩的语言风 ...
- 20145213《Java程序设计》第一周学习总结
20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...
- 20145330《Java程序设计》第四周学习总结
20145330<Java程序设计>第四周学习总结 一周两章新知识的自学与理解真的是很考验和锻炼我们,也对前面几章我们的学习进行了检测,遇到忘记和不懂的知识就再复习前面的,如此巩固也让我对 ...
- Java基础——clone()方法浅析
一.clone的概念 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
随机推荐
- [c#]一个窗体调用另一个窗体的事件
StuAddForm a = new StuAddForm(); a.IfStudent(textBox1.Text.Trim()):
- NGUI缓动函数
缓动函数:http://easings.net/zh-cn 研究NGUI的博客:http://dsqiu.iteye.com/category/295721
- eclipse或者myeclipse安装svn报错”unable to load default svn client”
是svn版本低了的问题 subeclipse下载,直接百度site1.X X为你需要的版本 解压site1.X 将此窗口先放到一边 在eclipse的安装目录下的dr ...
- asp.net Ajax刷新和无刷新的区别
无刷新按钮btnShua 刷新按钮btnWu label控件和calendar控件在updatePanel中显示 两个button按钮在div中 <%@ Page Language=" ...
- LoadLibrary函数定位DLL顺序
用LoadLibrary此函数来加载动态链接库到内存,Window 定位DLL的搜寻路径如下: 当前进程的可执行模块所在的目录. 当前目录. Windows 系统目录.GetSystemDirecto ...
- asp.net连接数据库
Asp.net web连接数据库步骤. 一. 新建一个web工程. 1.文件->添加->新建网站->asp.net web网站Winform窗体. 2.新建好的网站最下面有 ...
- Altium Designer PCB双面板制作打印操作步骤
Altium Designer PCB双面板制作打印操作步骤百度知道:http://jingyan.baidu.com/article/335530da83441c19cb41c3db.html?st ...
- SQL联合查询两个表的数据
刚有个项目,需要查询水位数据表中的水位信息,及查询降雨量表中统计时段降雨量的数据,以计算出日降雨量,而且时段是前一天8时到后一天8时总共24个小时. 两个子查询: 1.根据当前时间判断统计前天8时到今 ...
- HTTPS (HTTP Secure)
what is HTTPS HTTPS = HTTP + TSL Hypertext Transfer Protocol Secure (HTTPS) is acommunications proto ...
- Appium移动自动化测试之Eclipse
下载eclipse,这个下载方式比较多,eclipse官网,CSDN都有的下,版本根据自己操作系统选择,切记eclipse版本一定要与JDK版本一至,不然eclipse无法启动.现在我们来搭建Andr ...