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