Cloneable接口:实现此接口,以指示Object.clone()可以合法的对该类实例进行按字段复制。如果没有实现Object的clone方法,则会导致抛出CloneNotSupportedException异常。复制分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将跟着改变
}
}
分享到:
相关推荐
抽象类和接口 ...通过这个实验,我们学习了抽象类、接口、Cloneable 接口和多态性的概念,并掌握了如何使用它们来编写 Java 程序。我们还学习了浅拷贝和深拷贝的概念,并掌握了如何消除浅拷贝的方法。
本实验主要讲解了Java中的抽象类和接口的概念和使用方法,并且深入探讨了 Cloneable 接口和 clone 方法在对象内容复制中的应用。 一、抽象类的概念和使用方法 在 Java 中,抽象类是一个不能被实例化的类,它提供了...
总的来说,Map接口提供了一种高效的方式来存储和检索键值对数据,可变参数简化了函数调用,Cloneable接口支持对象的克隆,而多线程则为并发编程提供了基础。理解和掌握这些知识点对于Java开发至关重要。
在给出的内容部分中,通过具体的Java代码示例,讨论了在Java中实现对象复制的机制,特别是通过实现Cloneable接口和重写Object类的clone方法来完成对象的浅复制与深复制。 知识点一:Java对象复制的基本概念 在Java...
Cloneable 接口是一个接口,它只有一个抽象方法 `clone`,这个方法用于创建对象的副本。Cloneable 接口可以被多个类实现,每个类可以实现多个接口。例如,String 类实现了 Cloneable 接口,以便创建字符串的副本。 ...
所有类都继承自Object类,因此所有Java类都可以调用clone()方法,但前提是类必须实现Cloneable接口,否则会抛出CloneNotSupportedException异常。 克隆方法(clone方法)在使用时有以下限制: 1. clone方法总是返回...
前者需要特别注意的是,只有实现了Cloneable接口的类才能调用默认的clone()方法,否则会抛出CloneNotSupportedException异常。此外,如果对象内部包含不可克隆的对象(如final类型的对象或没有实现Cloneable接口的...
Cloneable 接口是一个标记接口,用于标识类可以被克隆。在 Java 中,Object 类提供了 clone() 方法,该方法用于创建对象的副本。然而,Object 类的 clone() 方法是 protected 的,因此需要在子类中重写该方法以便...
在Java中,原型模式通过实现Cloneable接口和覆盖clone()方法来复制对象,避免了使用构造函数进行深度复制的复杂性。接下来我们将深入探讨Java原型模式的核心概念、实现方式以及实际应用。 ### 核心概念 1. **原型...
在Java编程语言中,抽象类和接口是两种...同时,`Calendar` 类和 `GregorianCalendar` 类,以及 `Comparable`、`Cloneable` 接口等,都是在实际开发中经常遇到的工具,理解并熟练运用它们可以提高代码的效率和质量。
Java 实验 3 继承和多态 一、实验目的: 1. 学习和使用类的继承 ...本实验旨在学习和掌握 Java 语言的继承、多态、抽象类、接口、Cloneable 接口和对象内容的复制等概念和技术,並通過實踐掌握这些技术的应用。
1. **实现Cloneable接口**:首先,我们需要让我们的类实现`Cloneable`接口。这个接口不包含任何方法,但它标志着一个类可以被克隆。当我们尝试对一个对象调用`clone()`方法而该对象所属的类没有实现`Cloneable`接口...
Gson深度克隆是一个利用Gson库实现对象深度克隆的工具,主要通过将对象序列化为JSON字符串,再从JSON字符串反...易用性:无需实现Cloneable接口,适合快速开发。 性能考虑:适用于小到中等规模对象,性能开销相对较低。
6. **Cloneable接口**: - 实现`Cloneable`接口的对象可以通过`clone()`方法进行浅复制。 7. **包装类与基本类型之间的自动转换**: - Java提供了对应的包装类(如`Integer`、`Double`等)用于封装基本类型,并且...
Java中有一个内置的Cloneable接口和Object类的clone()方法,它们可以被用来实现对象的克隆。但是,直接使用clone()方法需要处理一些复杂的问题,比如深拷贝和浅拷贝的区别。 压缩包文件代码是一个使用Java实现原型...
在Java等支持克隆操作的语言中,原型模式可以通过实现Cloneable接口来实现。`Cloneable`接口表明一个对象可以被复制。当一个类实现了这个接口,那么就可以调用其`clone()`方法来创建一个与原对象相同的新对象。但是...
在Java等编程语言中,原型模式通过实现Cloneable接口来实现对象的复制。Cloneable接口没有定义任何方法,但它的存在表明该类的对象可以被克隆。当试图克隆一个实现了Cloneable接口的对象时,系统会调用默认的克隆...
由于C++没有内置的克隆机制像Java的Cloneable接口那样,因此我们需要手动实现克隆逻辑。 压缩包文件代码是一个使用C++实现原型模式的简单例子。 注意事项 1、在C++中,我们通常使用智能指针(如std::unique_ptr或std...
ArrayList继承自AbstractList,实现了List接口,RandomAccess接口,Cloneable接口和Serializable接口。实现List接口意味着ArrayList必须提供一系列用于添加、删除、修改和查找元素的方法。RandomAccess接口是一个...