关于Java中clone方法的一些小理解

Java中clone()的用法

  • 一个类如果不显示的重写clone(),那么这个类就不能直接调用clone方法
  • 在类中重写了clone方法后,发现系统还是会报错:CloneNotSupportedException
  • 如何处理?一个类如果没有实现cloneable接口,但却又调用了clone方法,系统就会给出上述错误,所以我们必须要实现cloneable接口并且重写clone方法,才可以正常的使用

接下来看clone的其中一种用法:浅拷贝

拷贝对象和原始对象的引用类型引用相同的对象

定义一个类,实现cloneable接口并且重写clone方法

public class CloneExample implements Cloneable{
    private int[] arr = new int[10];

    public CloneExample(){
        for (int i = 0; i < 10; i++) {
            arr[i] = i;
        }
    }

    public int get(int index){
        return arr[index];
    }

    public void set(int index,int value) {
        arr[index] = value;
    }

    @Override
    public CloneExample clone() throws CloneNotSupportedException {
        return (CloneExample) super.clone();
    }
}

main方法

public class CloneDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        CloneExample e1 = new CloneExample();
        CloneExample e2 = null;
        e2 = e1.clone();
        e1.set(4,555);
        System.out.println(e2.get(4));   //555
    }
}

可以发现e2指向的是e1new出来的对象,因为当e1发生改变时,e2也随之改变了

clone的另外一种用法:深拷贝

拷贝对象和原始对象的引用类型引用不同对象

与上面不同的是这里clone方法的重写内容不一样

public class CloneExample implements Cloneable{
    private int[] arr = new int[10];

    public CloneExample(){
        for (int i = 0; i < 10; i++) {
            arr[i] = i;
        }
    }

    public int get(int index){
        return arr[index];
    }

    public void set(int index,int value) {
        arr[index] = value;
    }

    @Override
    public CloneExample clone() throws CloneNotSupportedException {
        CloneExample result = (CloneExample) super.clone();
        result.arr = new int[this.arr.length];
        for (int i = 0; i < arr.length; i++) {
            result.arr[i] = arr[i];
        }
        return result;
    }
}

在重写的时候就新构造了一个对象,并且把数值赋给他

main方法

public class CloneDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        CloneExample e1 = new CloneExample();
        CloneExample e2 = null;
        e2 = e1.clone();
        e1.set(4,555);
        System.out.println(e2.get(4));  //4
    }
}

clone方法既复杂又有风险,不仅会抛出异常,还需要进行类型转换,尽量不要去使用clone方法,可以使用拷贝构造函数来拷贝对象

拷贝构造函数方法

此方法适用于深拷贝

package Demo02;

public class CloneExample{
    private int[] arr = new int[10];

    public CloneExample(){
        for (int i = 0; i < 10; i++) {
            arr[i] = i;
        }
    }

    public CloneExample(CloneExample ce){
        arr = new int[ce.arr.length];
        for (int i = 0; i < ce.arr.length; i++) {
            arr[i] = ce.arr[i];
        }
    }

    public int get(int index){
        return arr[index];
    }

    public void set(int index,int value) {
        arr[index] = value;
    }

}

main方法

package Demo02;

public class CloneDemo {
    public static void main(String[] args){
        CloneExample e1 = new CloneExample();
        CloneExample e2 = new CloneExample(e1);
        e1.set(4,500);
        System.out.println(e2.get(4));  //4
    }
}

以上就是对Java中clone方法的讲解啦,有不足的地方欢迎小伙伴在评论区留言

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值