Java 常见接口解析(Cloneable 接口)

2019-05-28  本文已影响0人  逆水寻洲

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
上一篇 下一篇

猜你喜欢

热点阅读