美文网首页
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 接口)

    Cloneable 接口 clone接口属于标志性接口(接口内不含有任何方法)。我们可以实现这个接口后,重写Obj...

  • Cloneable

    如何实现Cloneable接口?1、让该类实现java.lang.Cloneable接口;实现Cloneable接...

  • Java Cloneable接口

    Cloneable接口 clone:它允许在堆中克隆出一块和原对象一样的对象,并将这个对象的地址赋予新的引用。Ja...

  • Java对象克隆

    引自:Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨https:/...

  • Java深拷贝浅拷贝

    java.lang.Cloneable接口 一个带空体的接口称为标记接口(marker interface) 既不...

  • Java 常见接口解析(Serializable接口)

    Serializable 接口: Serializable接口属于标志接口,这个接口没有任何的方法定义,它仅仅只是...

  • Cloneable接口

    Cloneable接口的官方解释 1.Cloneable属于标记接口,接口内部没有方法和属性。实现该接口的类的实例...

  • Cloneable 接口

    浅拷贝(shallow clone)和深拷贝(deep clone) 浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中...

  • Cloneable接口

    前置知识 Java在处理对象和变量时是不同的.变量传入函数实际上是引用传入函数内,在函数内的变量和函数外传入的变量...

  • Cloneable接口

    2020-4-7 Cloneable接口是一个标记接口: 一个典型的示例: 对于Cloneable接口,有以下需要...

网友评论

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

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