之前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 的例子学习的更多相关文章

  1. java 深clone和浅clone

    1. clone类 public class Person implements Cloneable, Serializable{ /** * */ private static final long ...

  2. 分析java中clone()方法 (转载+修改)

    Java中的clone() 方法 java所有的类都是从java.lang.Object类继承而来的,而Object类提供下面的方法对对象进行复制. protected native Object c ...

  3. 20155322 2016-2017-2 《Java程序设计》 第一周学习总结

    20155322 2016-2017-2 <Java程序设计> 第一周学习总结 教材学习内容总结 本周学习内容的主要是: 一.浏览教材,根据自己的理解每章提出一个问题. 在浏览教材后,我提 ...

  4. 数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇

    HT 是啥:Everything you need to create cutting-edge 2D and 3D visualization. 这口号是当年心目中的产品方向,接着就朝这个方向慢慢打 ...

  5. Java并发包源码学习之AQS框架(三)LockSupport和interrupt

    接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...

  6. 20145213《Java程序设计》第四周学习总结

    20145213<Java程序设计>第四周学习总结 教材学习内容总结 本周任务是学习面向对象的继承.接口以及之后的如何活用多态.(还真是路漫漫其修远兮啊!)教材也是延续上周艰深晦涩的语言风 ...

  7. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  8. 20145330《Java程序设计》第四周学习总结

    20145330<Java程序设计>第四周学习总结 一周两章新知识的自学与理解真的是很考验和锻炼我们,也对前面几章我们的学习进行了检测,遇到忘记和不懂的知识就再复习前面的,如此巩固也让我对 ...

  9. Java基础——clone()方法浅析

    一.clone的概念 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...

随机推荐

  1. 微信支付开发-当前页面的URL未注册

    微信支付的开发设置要求设置微信支付可以发起的目录. 当出现“当前页面的URL未注册”的错误时,检查你的授权目录(一般是未填写或填写有误),注意要二级或者三级目录完全匹配.

  2. vim 使用2 转载 为了打开方便

    http://coolshell.cn/articles/5426.html vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个 ...

  3. DataSnap修改数据ApplyUpdates出现错误:连接繁忙导致另一个命令

    最近准备尝试用DBExpress做个SQL Serer应用,在学习的时候发现一个问题使用DBExpress连接Sql server 2008 express使用以下控件SQLConnection-&g ...

  4. JMS介绍【转载】

    什么是JMS JMS(Java Message Service) 即Java消息服务.它提供标准的产生.发送.接收消息的接口简化企业 应用的开发.它是J2EE规范的一部分,定义的接口标准,针对不同的厂 ...

  5. 【原】无规矩,不方圆——说一说正则里的exec()和test()

    今天一大早遇就遇到一件诡异的事儿,可能是思绪还没有澄静下来,一下子没反应过来.事情是这样的: 模板: <input class="name" type="text& ...

  6. PLSQL登录数据库 报ORA -12154的诡异问题

    https://q.cnblogs.com/q/89420/ 现象: 1.机器上先后安装了oracle两个版本的client.在装第一个client后,plsql可以顺利连接数据库a并登录. 2.安装 ...

  7. Sql Server 2012 Enterprise Edition 企业版 迅雷 下载地址

    Sql Server 2012 Enterprise Edition 企业版 迅雷 下载地址 版本号 cn_sql_server_2012_enterprise_edition_x86_x64_dvd ...

  8. 《IT蓝豹》完整阅读软件客户端app

    完整阅读软件客户端app,本项目里面还有扫描功能,搜索本地书籍,不过扫码功能通过c++层实现的. 本项目来自:https://github.com/JayFang1993/ScanBook Captu ...

  9. EntityFramework+MySql 笔记2

    话说刚刚配置好环境,刚刚写了几行代码,迫不及待地运行,duang! 踏进了第一个坑 看代码 static void Main(string[] args) { Database.SetInitiali ...

  10. printAB()

    #include <iostream> void printA() { std::cout << "A" << std::endl; } voi ...