`
stinge
  • 浏览: 149292 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中Cloneable接口的用法

    博客分类:
  • java
 
阅读更多

今天编写一个用到Cloneable接口的程序时才注意到原来clone()方法提供的是浅层拷贝,而不是我先前认为的深层拷贝。
class A implements Cloneable{
    int a=1;
    ArrayList b=new ArrayList();
    public A getClone(){
       return (A) this.clone();
    }
}
对于这样的一个类,如果调用它的getClone()方法进行复制的话,成员变量a会被复制,但是成员变量b不会像预想的那样会复制一个 ArrayList(),复制的对象与原先的对象中的b都会指向相同的一个ArrayList()。因此如果需要做深层拷贝需要添加额外的代码。
class A implements Cloneable{
    int a=1;
    ArrayList b=new ArrayList();
    public A getClone(){
       A temp=(A) this.clone();
       temp.b=new ArrayList();
       for(int i=0;i<b.size();i++){
          temp.b.add(b.get(i));
       }
       return temp;
    }
}

原始对象中的字符串和数组不受到克隆对象设置值的影响(会创建一个独立的),而类对象变量则会受到了克隆对象的影响。如list、map........ ;static修饰的也将是以引用的形式克隆

 

http://hi.baidu.com/lzqxiaoqiang09/blog/item/61ebce62b3fde36d0d33faaf.html

分享到:
评论
1 楼 goo.goo 2011-12-09  
  temp.b.add(b.get(i));

这里也得clone

相关推荐

    Java2游戏编程.pdf

    1.2 为什么在游戏中使用Java 1.3 为Java准备系统 1.3.1 安装Java SDK 1.3.2 编译和运行Java程序 1.3.3 使用命令行 1.3.4 使用集成开发环境(IDE) 1.3.5 关于Java2文档的说明 1.4 总结 第2章 预备:学习Java2 API 2.1 ...

    java初学者必看

    10.1.9 Cloneable接口应用 10.1.10 抽象类与接口区别 10.2 内部类概念 10.3 成员内部类 10.3.1 创建内部类对象 10.3.2 内部类的this引用 10.3.3 成员内部类的修饰符 10.4 方法内部类 10.5 匿名内部类 ...

    Java程序设计复习题.docx.docx

    Java语言规定构造方法名与类名必须相同 Java语言规定构造方法没有返回值,但不用void声明 Java语言规定构造方法不可以重载 Java语言规定构造方法只能通过new自动调用 下列叙述中错误的是 D 。 Java Application与...

    bigcoder84#study-notes#_4Object中的clone方法1

    Object类中的clone方法clone()方法的作用克隆方法用于创建对象的拷贝,为了使用clone方法,类必须实现java.lang.Cloneable接口

    JAVA高级程序设计测试题含答案.docx

    创建线程的两种方法中,从Thread类中继承的创建方式可以防止出现多父类问题 C. Thread类属于java.util程序包 D. 以上说法无一正确(正确答案) JAVA高级程序设计测试题含答案全文共43页,当前为第2页。 JAVA高级程序...

    java编程基础,应用与实例

    附录B JCreator的安装及其使用方法 441 B.1 安装JCreator 441 B.2 JCreator使用方法 443 附录C Swing程序设计简介 445 C.1 Swing组件 445 C.2 Swing组件的事件处理 447 附录D JDBC程序设计简介 449 ...

    Java数据库查询结果的输出

     要连接此数据库,需使用java.sql包中的类DriverManager。此类是用于管理JDBC驱动程序的实用程序类。它提供了通过驱动程序取得连接、注册,撤消驱动程序,设置登记和数据库访问登录超时等方法。  具体连接方法...

    Java高级程序设计测试含答案.docx

    创建线程的两种方法中,从Thread类中继承的创建方式可以防止出现多父类问题 C.Thread类属于java.util程序包 D.以上说法无一正确(正确答案) Java高级程序设计测试含答案全文共40页,当前为第2页。下面哪些选项属于...

    java-server-interview-questions:java服务端面试题整理

    java基础 1、Arrays.sort实现原理和Collections.sort实现原理...cloneable接口实现原理,浅拷贝or深拷贝 Java NIO使用 hashtable和hashmap的区别及实现原理,hashmap会问到数组索引,hash碰撞怎么解决 arraylist和linke

    Java进阶--深入理解ArrayList实现原理

    ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态...①构造方法由上面三种构造方法可知,默认情况下使用ArrayList会生成一个大小为10的Object类型的数组。也可以调用ArrayList(intinitialCa

    GOF23之原型模式

    一、核心作用: ...实现Cloneable接口和重写clone()方法 四、示例: 一、浅克隆 实体类: package com.hezeu.prototype; import java.io.Serializable; import java.util.Date; /** *@Classname She

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

    结合JVM解读浅拷贝和深拷贝

    java.lang.Cloneable和java.io.Serializable一样属于标记型接口,没有定义任何方法和属性。 一个类想要使用克隆方法 ...实现Cloneable接口,否则会抛出CloneNotSupportedException异常。 原创文章 39获赞 45访问量

Global site tag (gtag.js) - Google Analytics