`
每一天都不同
  • 浏览: 10204 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

Cloneable接口

 
阅读更多

Cloneable接口:实现此接口,以指示Object.clone()可以合法的对该类实例进行按字段复制。如果没有实现Object的clone方法,则会导致抛出CloneNotSupportedException异常。复制分2种:

  1. 浅表复制:被克隆对象内部成员变量只含基本数据类型时,只需进行浅表复制
  2. 深表复制:被克隆对象内部成员变量含有非基本数据类型时,需要进行深表复制

浅表复制:

class Student implements Cloneable {
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 浅表复制,被克隆对象内所有成员变量都为基本类型时
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            throw new Error(e.getMessage());
        }
    }

}

 

 深表复制:

class Teacher implements Cloneable {
    public String name;
    public Student student1;
    public Student student2;

    public Teacher(String name, Student student1, Student student2)   {
        this.name = name;
        this.student1 = student1;
        this.student2 = student2;
    }

    // 深表复制,被克隆对象内含有非基本类型成员变量时
    public Object clone() {
        try {
            Teacher t = (Teacher) super.clone();
            t.student1 = (Student) student1.clone();    //深表复制
            //t.student2 = (Student) student2.clone();
            //this.student2将不会被复制,t.student2只保存this.student2实例的引用
            return t;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            throw new Error(e.getMessage());
        }
    }
}
 

测试:

 

public class CloneableTest {
    public static void main(String[] args) {
        Student s1 = new Student("s1", 13);
        Student s2 = new Student("s2", 14);
        Teacher t = new Teacher("t", s1, s2);
        Teacher t2 = (Teacher) t.clone();
        Student s3 = (Student) s1.clone();
        
        System.out.println(s3.name);    //输出:s1
        s1.name = "ss1";
        System.out.println(s3.name);    //输出:s1,    
        //浅表复制成功,说明基本类型成员变量只需浅表复制即可
        
        System.out.println(t2.student1.name);   //输出:s1
        System.out.println(t2.student2.name);   //输出:s2
        t.student1.name = "s11";
        t.student2.name = "s22";
        System.out.println(t2.student1.name);   //输出:s1
        System.out.println(t2.student2.name);   //输出:ss2
        //在Teacher类的clone方法中,student2没有进行深表复制,克隆出来的t1.student2
        //只保存了t.student2实例的引用,当t.student2改变时t1.student2将跟着改变
    }
}
分享到:
评论

相关推荐

    Java实验7抽象类和接口.pdf

    抽象类和接口 ...通过这个实验,我们学习了抽象类、接口、Cloneable 接口和多态性的概念,并掌握了如何使用它们来编写 Java 程序。我们还学习了浅拷贝和深拷贝的概念,并掌握了如何消除浅拷贝的方法。

    学习Java实验7抽象类和接口.pdf

    本实验主要讲解了Java中的抽象类和接口的概念和使用方法,并且深入探讨了 Cloneable 接口和 clone 方法在对象内容复制中的应用。 一、抽象类的概念和使用方法 在 Java 中,抽象类是一个不能被实例化的类,它提供了...

    day16-Map、可变参数、Cloneable.pdf

    总的来说,Map接口提供了一种高效的方式来存储和检索键值对数据,可变参数简化了函数调用,Cloneable接口支持对象的克隆,而多线程则为并发编程提供了基础。理解和掌握这些知识点对于Java开发至关重要。

    编程语言java对象复制.pdf

    在给出的内容部分中,通过具体的Java代码示例,讨论了在Java中实现对象复制的机制,特别是通过实现Cloneable接口和重写Object类的clone方法来完成对象的浅复制与深复制。 知识点一:Java对象复制的基本概念 在Java...

    Java语言程序设计ppt第十四章(抽象类和接口)

    Cloneable 接口是一个接口,它只有一个抽象方法 `clone`,这个方法用于创建对象的副本。Cloneable 接口可以被多个类实现,每个类可以实现多个接口。例如,String 类实现了 Cloneable 接口,以便创建字符串的副本。 ...

    2型模式-MOOC课程内容.pdf

    所有类都继承自Object类,因此所有Java类都可以调用clone()方法,但前提是类必须实现Cloneable接口,否则会抛出CloneNotSupportedException异常。 克隆方法(clone方法)在使用时有以下限制: 1. clone方法总是返回...

    clone 深度克隆对象

    前者需要特别注意的是,只有实现了Cloneable接口的类才能调用默认的clone()方法,否则会抛出CloneNotSupportedException异常。此外,如果对象内部包含不可克隆的对象(如final类型的对象或没有实现Cloneable接口的...

    ava常用设计模式-原型模式

    Cloneable 接口是一个标记接口,用于标识类可以被克隆。在 Java 中,Object 类提供了 clone() 方法,该方法用于创建对象的副本。然而,Object 类的 clone() 方法是 protected 的,因此需要在子类中重写该方法以便...

    Java原型模式

    在Java中,原型模式通过实现Cloneable接口和覆盖clone()方法来复制对象,避免了使用构造函数进行深度复制的复杂性。接下来我们将深入探讨Java原型模式的核心概念、实现方式以及实际应用。 ### 核心概念 1. **原型...

    2022年抽象类和接口2.ppt

    在Java编程语言中,抽象类和接口是两种...同时,`Calendar` 类和 `GregorianCalendar` 类,以及 `Comparable`、`Cloneable` 接口等,都是在实际开发中经常遇到的工具,理解并熟练运用它们可以提高代码的效率和质量。

    Java实验3Java实验3.doc

    Java 实验 3 继承和多态 一、实验目的: 1. 学习和使用类的继承 ...本实验旨在学习和掌握 Java 语言的继承、多态、抽象类、接口、Cloneable 接口和对象内容的复制等概念和技术,並通過實踐掌握这些技术的应用。

    原型模式代码示例

    1. **实现Cloneable接口**:首先,我们需要让我们的类实现`Cloneable`接口。这个接口不包含任何方法,但它标志着一个类可以被克隆。当我们尝试对一个对象调用`clone()`方法而该对象所属的类没有实现`Cloneable`接口...

    gson深度克隆jar包

    Gson深度克隆是一个利用Gson库实现对象深度克隆的工具,主要通过将对象序列化为JSON字符串,再从JSON字符串反...易用性:无需实现Cloneable接口,适合快速开发。 性能考虑:适用于小到中等规模对象,性能开销相对较低。

    JAVA抽象类和接口讲义PPT教案学习.pptx

    6. **Cloneable接口**: - 实现`Cloneable`接口的对象可以通过`clone()`方法进行浅复制。 7. **包装类与基本类型之间的自动转换**: - Java提供了对应的包装类(如`Integer`、`Double`等)用于封装基本类型,并且...

    通过java实现原型模式(Prototype Pattern).rar

    Java中有一个内置的Cloneable接口和Object类的clone()方法,它们可以被用来实现对象的克隆。但是,直接使用clone()方法需要处理一些复杂的问题,比如深拷贝和浅拷贝的区别。 压缩包文件代码是一个使用Java实现原型...

    原型模式类

    在Java等支持克隆操作的语言中,原型模式可以通过实现Cloneable接口来实现。`Cloneable`接口表明一个对象可以被复制。当一个类实现了这个接口,那么就可以调用其`clone()`方法来创建一个与原对象相同的新对象。但是...

    [创建型模式] 原型模式的理解

    在Java等编程语言中,原型模式通过实现Cloneable接口来实现对象的复制。Cloneable接口没有定义任何方法,但它的存在表明该类的对象可以被克隆。当试图克隆一个实现了Cloneable接口的对象时,系统会调用默认的克隆...

    通过C++实现原型模式(Prototype Pattern).rar

    由于C++没有内置的克隆机制像Java的Cloneable接口那样,因此我们需要手动实现克隆逻辑。 压缩包文件代码是一个使用C++实现原型模式的简单例子。 注意事项 1、在C++中,我们通常使用智能指针(如std::unique_ptr或std...

    java关键字ArrayList详解

    ArrayList继承自AbstractList,实现了List接口,RandomAccess接口,Cloneable接口和Serializable接口。实现List接口意味着ArrayList必须提供一系列用于添加、删除、修改和查找元素的方法。RandomAccess接口是一个...

Global site tag (gtag.js) - Google Analytics