`

j2se----clone

    博客分类:
  • J2SE
阅读更多
对象克隆
protected Object clone()
   以上的方法不能直接调用,需要实现Cloneable接口
class Person implements Cloneable{
    private String name;
    public String getName(){
      return this.name;
    }
    public void setName(String name){
       this.name = name;
    }
    public Object clone(){
       return super.clone(); //虽然自己不知道克隆,但是Object知道啊
    }
}


在以后的JAVA类库中会经常看到Clonable接口出现,只有实现了此接口的对象才能被克隆
尽管Object里面有克隆方法

Clonable---告诉JVM这个对象可能被拷贝
 public Object clone(){//---重写 clone说明这个对象可以被拷贝
       return super.clone(); //虽然自己不知道克隆,但是Object知道啊
    }

但是上面的属于浅拷贝:,Object 类提供的方法clone 只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝,确实是非常浅,两个对象共享了一个私有变量。。。。是一个种非常不安全的方式,在实
际项目中使用还是比较少的

深入的拷贝:

public class Thing implements Cloneable{
//定义一个私有变量
private ArrayList<String> arrayList = new ArrayList<String>();
    @Override
    public Thing clone(){
        Thing thing=null;
    try {
        thing = (Thing)super.clone();
        thing.arrayList = (ArrayList<String>)this.arrayList.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return thing;
    }
}
Clone与final两对冤家。对象的clone 与对象内的final属性是由冲突的

private final ArrayList<String> arrayList = new ArrayList<String>();

你要使用clone 方法就在类的成员变量上不要增加final 关键字。
原型模式适合在什么场景使用?一是类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等;二是通过new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式;三是一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。

分享到:
评论

相关推荐

    面试题20101210

    - 版本控制:Git的基本操作(clone,add,commit,push,pull,branch,merge等)和高级用法。 - 构建工具:Maven或Gradle的配置,依赖管理,构建流程等。 4. **源码分析**: - 对开源项目或自定义代码的阅读和...

    jalam-jms-client:J2SE JMS 客户端

    生产级 J2SE JMS 客户端。 特征 : 双重支持 JMS 1.1 和 HornetQ 本机(“核心”)协议。 故障转移:自动重新连接。 如果可用,服务器之间的级联故障转移。 多台服务器的并行连接。 并行订阅多个主题/队列。 ...

    J2SE学习中的30个基本概念

    实现该接口的类可以通过`clone()`方法创建一个自身的新副本。 #### 23. 接口的实现 实现接口的类必须提供接口中声明的所有方法的具体实现。一个类可以实现多个接口,但只能继承一个父类。 #### 24. 实现接口的方式...

    s1tbx:Sentinel-1工具箱

    安装J2SE 1.8 JDK并相应地设置JAVA_HOME。 安装Maven并相应地设置MAVEN_HOME。 安装git 将$JAVA_HOME/bin和$MAVEN_HOME/bin到PATH。 将S1TBX源代码和相关存储库克隆到SNAP / git clone ...

    2005-2011年全新各大公司j2ee面试题汇总大全

    - 在J2SE 5.0之前,`switch`语句只支持`byte`、`short`、`char`和`int`类型的值。 - Java 7之后,`switch`还支持`String`类型的值。 - 对于`long`类型,直到Java 7也不支持。 #### 6. `short`类型的加法问题 - `...

    CORE JAVA总结_沈红喜

    - **克隆**:使用 `clone()` 方法也实现了深拷贝。 #### 5. 控制台输入数组 可以使用循环结构如 `while` 或 `for` 来从控制台读取数组元素。 #### 6. 二维数组 二维数组允许每一行的元素个数不同。可以使用 `...

    scuba:用于更好访问的智能卡实用程序 (git-svn clone)

    scuba_sc_j2se scuba_smartcards scuba_util 使用 Gradle 构建(推荐) 当您使用 Gradle 构建系统时,只需运行 ./gradlew install 将所有四个库安装到本地存储库。 请注意,您必须使用包装器(而不是直接调用 ...

    java面试大全

    ### Java面试大全知识点详解 #### 一、Java基础知识 1. **Java基本数据类型** Java中有八种基本数据类型:byte... - 使用`clone()`方法、反序列化、反射等。 23. **类加载机制** - 类加载器加载类到JVM的过程。

    java简答题答案

    - **J2SE(Java Platform, Standard Edition)**:是Java标准版,为桌面和工作站应用程序提供了一个完整的开发和运行环境。 - **J2ME(Java Platform, Micro Edition)**:为嵌入式设备和移动设备(如手机、PDA等)提供...

    java简答题答案.pdf

    - **J2SE(Java 2 Platform, Standard Edition)**:标准版,主要用于桌面和服务器应用开发。 - **J2ME(Java 2 Platform, Micro Edition)**:微型版,适用于嵌入式设备,如手机、PDA等。 3. **switch语句的条件...

    java经典面试题

    #### J2SE基础 1. **九种基本数据类型的大小,及其封装类**: - Java提供了八种基本数据类型(`byte`, `short`, `int`, `long`, `float`, `double`, `boolean`, `char`),每种类型都对应一个封装类。例如,`byte` ...

    java基础经典总结1

    - `clone()`方法用于创建一个对象的副本,实现`Cloneable`接口的类才能使用。 - 浅拷贝和深拷贝的区别在于是否复制引用对象的内容。 - `Object`类还包含`equals()`, `hashCode()`, `toString()`, `finalize()`, `...

    最新Java面试大全

    - **克隆**:实现Cloneable接口并重写clone()方法。 - **枚举**:利用枚举类型创建对象。 - **反序列化**:将序列化的对象恢复为对象实例。 #### 29. 类加载器的加载方式 - **Bootstrap ClassLoader**:负责加载...

    Java开发人员面试宝典.docx

    15. **新建对象的几种方式**:通过new关键字调用构造器、使用clone方法、反序列化以及工厂方法等。 16. **&和&&的区别**:&是按位与运算符,&&是逻辑与运算符。在布尔表达式中,&&具有短路特性,如果左边表达式为...

    Java编程规则

    - 实现`equals()`、`hashCode()`、`toString()`、`clone()`(实现`Cloneable`接口)、`Serializable`接口,增强类的功能性和兼容性。 - **主方法**:每个类考虑包含`main()`方法,用于测试和示例代码展示。 - **方法...

    Java代码编写的30条建议

    - `clone()`(实现`Cloneable`接口) - `Serializable`接口 #### 3. 包含测试代码 为每个类加入`main()`方法,用于测试类的功能,这有助于代码的验证和维护,同时也提供了一个类的使用示例。 #### 4. 方法设计...

    JAVA笔试题,面试题(吐血推荐)

    22. **创建实例的方式**:通过`clone`、反射、序列化等方式。 23. **垃圾回收算法**:包括标记-清除算法、复制算法、标记-整理算法等。 24. **线程池实现**:使用`ExecutorService`接口和`ThreadPoolExecutor`实现。...

    利用JAVA实现局域网的跨平台实时视频传输_吴良斌1

    JMF(JavaMediaFramework)是SUN公司提出的Java媒体架构,它是对应Java2平台标准版(J2SE)的一种可选用的应用编程接口(API)。JMF的源代码通过SCSL(Sun社团源代码许可模式)发布。本文实现视频传输系统的结构及其...

Global site tag (gtag.js) - Google Analytics