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