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中的抽象类和接口的概念和使用方法,并且深入探讨了 Cloneable 接口和 clone 方法在对象内容复制中的应用。 一、抽象类的概念和使用方法 在 Java 中,抽象类是一个不能被实例化的类,它提供了...
抽象类和接口 ...通过这个实验,我们学习了抽象类、接口、Cloneable 接口和多态性的概念,并掌握了如何使用它们来编写 Java 程序。我们还学习了浅拷贝和深拷贝的概念,并掌握了如何消除浅拷贝的方法。
总的来说,Map接口提供了一种高效的方式来存储和检索键值对数据,可变参数简化了函数调用,Cloneable接口支持对象的克隆,而多线程则为并发编程提供了基础。理解和掌握这些知识点对于Java开发至关重要。
在 Java 语言中,接口使用 `interface` 关键字定义。接口可以包含抽象方法和常量。抽象方法是没有实现的方法,实现接口的类必须实现这些方法。常量是不能被修改的变量,用于存储某些固定的值。 例如,Comparable ...
在给出的内容部分中,通过具体的Java代码示例,讨论了在Java中实现对象复制的机制,特别是通过实现Cloneable接口和重写Object类的clone方法来完成对象的浅复制与深复制。 知识点一:Java对象复制的基本概念 在Java...
此外,`Cloneable` 接口的使用有一个潜在问题:由于 `clone()` 方法是 `protected` 的,如果你不重写它,其他类将无法直接调用 `clone()`。因此,我们通常会提供一个公共的 `clone()` 方法来覆盖默认的 `clone()`。 ...
在Java中,原型模式常常使用Cloneable接口和Object类的clone()方法来实现。clone()方法默认是protected类型的,这意味着它不能在类外直接调用,除非在类中将其声明为public。所有类都继承自Object类,因此所有Java类...
9. 学习使用 Cloneable 接口和 clone 方法进行对象内容的复制 10. 理解浅复制和深复制的概念,掌握覆盖 clone 方法进行对象内容深复制的技术 二、实验任务: Task 1: 使用 Java SDK 建立一个非图形化的标准 Java ...
前者需要特别注意的是,只有实现了Cloneable接口的类才能调用默认的clone()方法,否则会抛出CloneNotSupportedException异常。此外,如果对象内部包含不可克隆的对象(如final类型的对象或没有实现Cloneable接口的...
2. `java.lang.Cloneable`: 标记接口,表示对象可以被克隆。 3. `java.lang.Runnable`: 实现此接口的类可以作为线程执行的任务。 4. `java.util.List`, `Set` 和 `Map`: 这些接口定义了集合框架的核心接口,提供数据...
在Java中,原型模式通过实现Cloneable接口和覆盖clone()方法来复制对象,避免了使用构造函数进行深度复制的复杂性。接下来我们将深入探讨Java原型模式的核心概念、实现方式以及实际应用。 ### 核心概念 1. **原型...
Cloneable 接口是一个标记接口,用于标识类可以被克隆。在 Java 中,Object 类提供了 clone() 方法,该方法用于创建对象的副本。然而,Object 类的 clone() 方法是 protected 的,因此需要在子类中重写该方法以便...
6. **Cloneable接口**: - 实现`Cloneable`接口的对象可以通过`clone()`方法进行浅复制。 7. **包装类与基本类型之间的自动转换**: - Java提供了对应的包装类(如`Integer`、`Double`等)用于封装基本类型,并且...
深拷贝可以通过序列化和反序列化实现,或者手动实现Cloneable接口并重写`clone()`方法。 示例代码(使用序列化): ```java import java.io.*; class MyClass implements Serializable { int a; String b; ...
在Java编程语言中,抽象类和接口是两种...同时,`Calendar` 类和 `GregorianCalendar` 类,以及 `Comparable`、`Cloneable` 接口等,都是在实际开发中经常遇到的工具,理解并熟练运用它们可以提高代码的效率和质量。
1. **实现Cloneable接口**:首先,我们需要让我们的类实现`Cloneable`接口。这个接口不包含任何方法,但它标志着一个类可以被克隆。当我们尝试对一个对象调用`clone()`方法而该对象所属的类没有实现`Cloneable`接口...
java的两种深度克隆方法,1cloneTest是用Cloneable接口的clone方法实现(对象必须要实现cloneable接口).2cloneSerialize.java是用对象流写对象到byte数组中,然后从byte数组中取得对象.(对象必须要实现serializble接口)
Java中有一个内置的Cloneable接口和Object类的clone()方法,它们可以被用来实现对象的克隆。但是,直接使用clone()方法需要处理一些复杂的问题,比如深拷贝和浅拷贝的区别。 压缩包文件代码是一个使用Java实现原型...
在Java等支持克隆操作的语言中,原型模式可以通过实现Cloneable接口来实现。`Cloneable`接口表明一个对象可以被复制。当一个类实现了这个接口,那么就可以调用其`clone()`方法来创建一个与原对象相同的新对象。但是...