`

Cloneable接口的使用

    博客分类:
  • java
阅读更多
Cloneable接口声明中没有指定要实现的方法,一个类要实现Cloneable,最好是覆盖Object类的clone()方法。


1. 如果类没有实现Cloneable接口,调用类对象的clone方法抛出CloneNotSupportedException。

public class CloneableTest {

	public static void main(String[] args) throws CloneNotSupportedException {
		CloneableTest test = new CloneableTest();
		Object obj = test.clone();
	}
}


结果是抛出CloneNotSupportedException异常


2. 我们无法定义一个类数组实现了Cloneable, 所以数组默认是实现了Cloneable接口。

// Invalid definition
public class Person[] implements Cloneable


	int[] iMarks = new int[] { 4, 7, 1 , 8 };
	int[] copyofiMarks = iMarks.clone();


运行没问题。


3. Object提供的clone方法是浅度复制 (shallow copy)。

public class Name {
	private String firstName;
	private String lastName;
	// Omit the getters and setters as well as constructors
}


public class Person implements Cloneable {
	private Name name;
	private int age;
	// Omit the getters and setters as well as constructors

	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}


	Name name = new Name("John", "Chen");
	Person person = new Person(name, 28);
	Person copyOfPerson = (Person)person.clone();
	name.setFirstName("Johnny");
	name.setLastName("Qin");
	person.setAge(29);
	System.out.println(copyOfPerson.getName().getFirstName() + " " +
			copyOfPerson.getName().getLastName() + 
			" " + copyOfPerson.getAge());


结果是:Johnny Qin 28

对于原型类型(如int),clone是没问题的,被clone的对象改变了不会影响到复制品(age还是28)。

对于引用类型(如Name),clone方法只是复制了引用(浅度就体现在这),如果改变了引用的值,复制品也会受到影响(Johnny Qin)。


4. 继承链上的祖先必须要有一个类声明实现Cloneable接口。

public class Person {
}


public class Male extends Person implements Cloneable {
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}


public class ChineseMale extends Male {
}


Person person = new Person();
Male male = new male();
ChineseMale chineseMale = new ChineseMale();
person.clone();
male.clone();
chineseMale.clone();


person.clone()会报错。


5. Object类本身没有实现Cloneable接口,在一个Object类对象上调用clone方法会报CloneNotSupportedException。
分享到:
评论

相关推荐

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

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

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

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

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

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

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

    在 Java 语言中,接口使用 `interface` 关键字定义。接口可以包含抽象方法和常量。抽象方法是没有实现的方法,实现接口的类必须实现这些方法。常量是不能被修改的变量,用于存储某些固定的值。 例如,Comparable ...

    编程语言java对象复制.pdf

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

    U10316024_HW_15_10:类 MyStack 实现 Cloneable 并使用深循环

    此外,`Cloneable` 接口的使用有一个潜在问题:由于 `clone()` 方法是 `protected` 的,如果你不重写它,其他类将无法直接调用 `clone()`。因此,我们通常会提供一个公共的 `clone()` 方法来覆盖默认的 `clone()`。 ...

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

    在Java中,原型模式常常使用Cloneable接口和Object类的clone()方法来实现。clone()方法默认是protected类型的,这意味着它不能在类外直接调用,除非在类中将其声明为public。所有类都继承自Object类,因此所有Java类...

    Java实验3Java实验3.doc

    9. 学习使用 Cloneable 接口和 clone 方法进行对象内容的复制 10. 理解浅复制和深复制的概念,掌握覆盖 clone 方法进行对象内容深复制的技术 二、实验任务: Task 1: 使用 Java SDK 建立一个非图形化的标准 Java ...

    clone 深度克隆对象

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

    Java API接口详述.rar

    2. `java.lang.Cloneable`: 标记接口,表示对象可以被克隆。 3. `java.lang.Runnable`: 实现此接口的类可以作为线程执行的任务。 4. `java.util.List`, `Set` 和 `Map`: 这些接口定义了集合框架的核心接口,提供数据...

    Java原型模式

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

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

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

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

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

    2022年抽象类和接口2.ppt

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

    原型模式代码示例

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

    java克隆对象(两种方法)

    java的两种深度克隆方法,1cloneTest是用Cloneable接口的clone方法实现(对象必须要实现cloneable接口).2cloneSerialize.java是用对象流写对象到byte数组中,然后从byte数组中取得对象.(对象必须要实现serializble接口)

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

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

    原型模式类

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

    JavaSE-接口部分笔记

    在Java中,声明接口时使用`interface`关键字,并且接口中的方法默认是`public abstract`的,而成员变量默认为`public static final`。 2. **接口的实现** - 实现接口:一个类可以通过implements关键字实现一个或...

Global site tag (gtag.js) - Google Analytics