Cloneable 接口
clone接口属于标志性接口(接口内不含有任何方法)。我们可以实现这个接口后,重写Object中的clone方法,通过对象调用clone方法实现对象clone,如果不实现这个接口,则会抛出CloneNotSupportedException(克隆不被支持)异常。
那什么是对象克隆呢?
假如我有一个Student类,类定义如下:
public class Student {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
现在我有一个Student类对象 stu(id=12,name="张三"),我想生成一个和stu对象一样的对象(对象属性的值相同),这个过程就叫克隆。
如果不使用clone方法,那么我们可以new一个新对象,然后通过构造方法赋值,这是一个可行的方法。不过在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中会消耗大量的时间,同时创建第一个实例和创建第二个实例的初始化信息并未改变。在此种情况下,直接New 一个实例对象显得太浪费,不合理。所以这种情况下,对象克隆(clone)是一种很好的解决方法(对象属性直接基于堆复制)。
PS:实现简单的对象复制,常用的四种方法
(1)将A对象的值分别通过set方法加入B对象中;
(2)通过重写java.lang.Object类中的方法clone();
(3)通过org.apache.commons中的工具类BeanUtils和PropertyUtils进行对象复制;
(4)通过序列化实现对象的复制。
如何使用clone方法?
一个很典型的调用clone()代码如下:
class CloneClass implements Cloneable{
public int age;
public Object clone(){
CloneClass o = null;
try{
o = (CloneClass)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}
案例代码:
class Student implements Cloneable {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Object clone() {
Student student = null;
try {
student = (Student) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return student;
}
}
public class CloneTest {
public static void main(String[] args) {
Student student=new Student();
student.setId(231);
student.setName("张三");
System.out.println(student.getName());
Student cloneStudent = (Student)student.clone();
System.out.println(cloneStudent.getName());
}
}
image.png
网友评论