美文网首页
Java 常见接口解析(Cloneable 接口)

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

作者: 逆水寻洲 | 来源:发表于2019-05-28 16:05 被阅读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

    相关文章

      网友评论

          本文标题:Java 常见接口解析(Cloneable 接口)

          本文链接:https://www.haomeiwen.com/subject/xvudtctx.html