关于Object类的clone()方法

clone()方法是用于浅克隆或者深克隆一个java对象的,但是要注意一个误区:clone方法是Object类的,并不是Cloneable接口的,Cloneable只是一个标记接口,标记接口是用于标记实现该接口的类具有某种该接口标记的功能,常见的标记接口有三个:Serializable、Cloneable、RandomAccess,没有实现Cloneable接口,那么调用clone方法就会爆出CloneNotSupportedException异常。

要使得一个java类可以实现克隆,那么该类就需要实现Cloneable接口,并且重写基类Object的clone方法,其实Object的clone方法就已经默认有克隆的能力了,并且实现的是浅克隆,那为什么一定得重写clone方法呢?

我们先来看Object类的clone方法源码:

protected native Object clone() throws CloneNotSupportedException;

可以看到,该方法非常之特殊:

  1. 方法被native关键字修饰,并且该方法没有方法体,没有方法体的方法我们认为是抽象方法,可是Object类并不是一个抽象类,而是一个具体类,那为什么还能容纳抽象方法呢,其实就是native关键字在起作用,被native关键字修饰的方法属于本地方法,表示Java的作用范围已经无法达到,底层会去调用C语言或者C++的库。
  2. 该方法是被protected修饰,这就表明我们在子类中不重写此方法,就在子类外无法访问,因为这个protected权限是仅仅能在Object所在的包和子类能访问的,这也验证了子类重写父类方法权限修饰符可以变大但不能变小的说法。

所以我们要使得一个类具有clone的能力,可以先实现Cloneable接口,再重写clone方法,方法内部去调用了父类的clone方法,其实是为了扩大访问权限,也可以把protected改为public,以后再继承就不用重写了。当然这只是浅克隆的clone函数,深克隆就需要修改clone的方法体了。

public class Mytest implements  Cloneable{
    /**
     * 重写clone方法,调用父类默认的clone方法,实现的是浅克隆
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值