关于clone方法中native的一些理解

Object是所有类的基类,当你没有显示extends一个父类时,编译期会自动为你加上一个Object类。
在这里插入图片描述

1.这是一个native方法

说明这个方法的实现不是在java中,而是由C/C++实现,并编译成.dll文件,由java调用。registerNatives主要是将C/C++的方法映射到java中的native方法,实现方法命名的解耦。

private static native void registerNatives();
    static {
        registerNatives();
    }

2. clone方法。

protected native Object clone() throws CloneNotSupportedException;

通过源代码可以发现几点:

1.clone方法是native方法,native方法的效率远高于非native方法,因此还是使用clone方法去做对象的拷贝(但直接使用clone方法,实现的是浅复制,即获取的属性相同地址,所以容易产生类似脏数据情况),而不是使用new的方法去copy。

2.此方法被protected修饰。这就意味着想要使用,必须继承它(废话,默认都是继承的)。然后重载它(这里是直接使用实现CloneAble接口的形式),如果想要使得其他类能使用这个类,需要设置成public。

3.返回值是一个Object对象,所以要强制转换才行(强制转换后,方法调用会调用子类的方法,实现CloneAble接口的类,会重写clone方法,默认重写方法会直接调用父类的clone()方法去克隆父类)。

 @Override
    protected Object clone() throws CloneNotSupportedException {
        //return this.deepClone();
        return super.clone();
    }

所以最后调用时,需要强制转换成子类,来调用该方法,否则会不知道克隆谁
TestReen copy = (TestReen)tReen.clone();

public class TestReen{
	
	public static void main(String[] args) throws Exception{
		
		TestReen tReen = new TestReen();
		
		TestReen copy = (TestReen)tReen.clone();
	}
	
}

1.如果在没有实现Cloneable接口的实例上调用Object的clone()方法,则会导致抛出CloneNotSupporteddException;

2.按照惯例,实现此接口的类应该使用公共方法重写Object的clone()方法,因Object的clone()方法是一个受保护的方法;
因此想实现clone的话,除了继承Object类外,还需要实现Cloneable接口;


原文链接:https://blog.csdn.net/qq_32924343/article/details/77856338

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值