java基础| clone方法解析

  •     题外话

    熟悉jav开发的都知道,java是纯面向对象的编程语言,和c++有很大的不同,其中取消指针类型就是一个很大的不同之处。由于在java语言中取消了指针这个概念,但是这并不妨碍java对指针概念的应用(表面上我们假装不用指针,实际上我们都知道用指针真香哎!)。在java中,实质撒谎嗯每个new语句返回的都是一个指针的引用,只不过在大部分情况下我们都不需要关心如何去操作这个指针而已。

  •    按值传递和按引用传递

    在java中处理基本数据类型时,都是采用按值传递(传递的是输入参数的复制),除此之外的其他类ixng都是按引用传递(传递的对是对象的一个引用)。同时在方法中使用"="赋值时也采用了引用传递。

    在实际的开发中,经常会遇到从某个已有的对象A中创建出另外一个具有相同状态的对象B,并且对B的修改不会影响到A的状态。这个时候简单的赋值操作显然无法达到目的,java中地宫了clone()方法来满足需求。

  •    clone()方法介绍

    Java中所有类默认都是继承自Object类,而Object类中提供了一个clone()方法,这个方法的作用是返回一个Object对象的复制,这个复制函数返回的是一个新的对象而不是一个引用,因此,对新对象的修改不会影响到原来对象的值。

    clone()方法的使用步骤:

  1. 实现clone()方法首先需要继承Cloneable接口。Cloneable接口实质上是一个标识接口(只有接口类,内部没有接口方法,不需要重新实现它的方法)。
  2. 在类中重写Object类中的clone方法。
  3. 在clone方法中调用super.clone()方法。无论clone类的继承结构是什么,super.clone()都会直接或间接调用java.lang.Object类中的clone()方法。
  4. 把浅复制的引用指向原型对象新的克隆体。

    代码示例:

class ShallowCloneMain implements Cloneable {

    private int a = 0;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
    public void changeInt(){
        this.a = 1;
    }

    /*
    * 浅复制
    * */
    public Object clone(){
        Object o = null;
        try {
             o = (ShallowCloneMain)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }
}

    对于类中只有一些基本的数据类型时,采用上述方法就可以实现clone了,但是当类中包含了一些对象(也就是说要clone的对象中包含有二级引用)时,这个时候就需要进行深复制了。深复制的代码示例如下:

class DeepCloneMain implements Cloneable {

    private int a = 0;
    private Date date = new Date();   //date是一个对象类型的引用

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public void changeInt(){
        this.a = 1;
    }
    public void changeDate(Date dates){
        this.date.setMonth(4);
    }

    /*
     * 深复制
     * */
    public Object clone(){
        Object o = null;
        try {
            o = (DeepCloneMain)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        //深复制对象中的引用类型
        o.date = (DeepCloneMain)this.getDate().clone();
        return o;
    }
  • Note:

    浅复制(Shallow Clone):被复制对象的所有变量都包含有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象(也就是说被clone对象中的二级引用仍然指向原来的对象)。

    深复制(Deep Clone):被复制对喜爱嗯的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对喜爱嗯的变量将指向被复制新的对象(也就是指被clone对象的二级应用也指向了新的值)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值