今天编写一个用到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.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 ...
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语言规定构造方法名与类名必须相同 Java语言规定构造方法没有返回值,但不用void声明 Java语言规定构造方法不可以重载 Java语言规定构造方法只能通过new自动调用 下列叙述中错误的是 D 。 Java Application与...
Object类中的clone方法clone()方法的作用克隆方法用于创建对象的拷贝,为了使用clone方法,类必须实现java.lang.Cloneable接口
创建线程的两种方法中,从Thread类中继承的创建方式可以防止出现多父类问题 C. Thread类属于java.util程序包 D. 以上说法无一正确(正确答案) JAVA高级程序设计测试题含答案全文共43页,当前为第2页。 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.sql包中的类DriverManager。此类是用于管理JDBC驱动程序的实用程序类。它提供了通过驱动程序取得连接、注册,撤消驱动程序,设置登记和数据库访问登录超时等方法。 具体连接方法...
创建线程的两种方法中,从Thread类中继承的创建方式可以防止出现多父类问题 C.Thread类属于java.util程序包 D.以上说法无一正确(正确答案) Java高级程序设计测试含答案全文共40页,当前为第2页。下面哪些选项属于...
java基础 1、Arrays.sort实现原理和Collections.sort实现原理...cloneable接口实现原理,浅拷贝or深拷贝 Java NIO使用 hashtable和hashmap的区别及实现原理,hashmap会问到数组索引,hash碰撞怎么解决 arraylist和linke
ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态...①构造方法由上面三种构造方法可知,默认情况下使用ArrayList会生成一个大小为10的Object类型的数组。也可以调用ArrayList(intinitialCa
一、核心作用: ...实现Cloneable接口和重写clone()方法 四、示例: 一、浅克隆 实体类: package com.hezeu.prototype; import java.io.Serializable; import java.util.Date; /** *@Classname She
设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...
java.lang.Cloneable和java.io.Serializable一样属于标记型接口,没有定义任何方法和属性。 一个类想要使用克隆方法 ...实现Cloneable接口,否则会抛出CloneNotSupportedException异常。 原创文章 39获赞 45访问量