關於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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章