jdk原始碼閱讀之Object類
阿新 • • 發佈:2018-12-15
Object的作用
Object是java所有類的基類,定義了所有類的基礎方法 。這個類所定義的方法也不多,大部分是native方法。
什麼是native方法
native關鍵字標識的java方法為本地方法,底層是有c/c++編寫的程式編譯後dll檔案,java載入dll檔案後,可用通過本地方法呼叫dll中函式,如有疑問可用參考JNI使用方式
Object的類圖
描述類圖主要的目的是讓我們明白我們當前所閱讀的類的原始碼在整個工程中的所處的位置。
Object重要方法原始碼解析
native方法
native方法是使用c/c++編寫的程式,我們在java原始碼中是看不到程式碼的,因此對於這些類,如果不是需要深入瞭解,我們知道作用即可!
static native void registerNatives() public final native class<?> getClass() 返回此object的執行時類 public native int hashCode() 返回類的hash值 protect native object clone() throws CloneNotSupportedException; 克隆,是建立類的一種方式,object的clone方法是淺複製,如果想實現深拷貝,需要自己編寫clone方法 public final native void notify() 喚醒在此物件監視器上等待的單個執行緒 public final native void notifyAll() 喚醒在此物件監視器上等待的所有執行緒 public final native void wait(long timeout) throws InterruptedException;
final方法
final方法是不允許繼承的子類覆蓋的,換個說法,final方法是所有類都是一樣的。
public final native class<?> getClass() 返回此object的執行時類 public final native void notify() public final void wait() throws InterruptedExceptiop; public final native void wait(long timeout) throws InterruptedException; final void wait(long timeout,int nanos) ......
所有的final方法都是native方法,不要以為“public final void wait() throws InterruptedExceptiop;”這個方法不是native方法,這個方法裡面的程式碼只有一句:wait(0);也就是他呼叫的是“public final native void wait(long timeout) throws InterruptedException;”方法,所以說他也是native方法是沒錯的。
final方法和native方法的總結
是final方法肯定是native方法,但是是native方法不一定是final方法。 是native方法但不是final方法的方法有兩個:
- public native int hashCode(); 自己定義hashcode值的計算,hashCode 的常規協定是: 1.在應用程式執行期間,如果一個物件用於equals()方法的屬性沒有被修改的話,那麼要保證對該物件多次返回的hashcode值要相等。2.如果2個物件通過equals()方法判斷的結果為true,那麼要保證二者的hashcode值相等。3.如果2個物件通過equals()方法判斷的結果為false,那麼對二者hashcode值是否相等並沒有明確要求。如果不相等,那麼能夠提升散列表的效能。
- protect native object clone() throws CloneNotSupportedException;克隆,是建立類的一種方式,object的clone方法是淺複製,如果想實現深拷貝,需要自己編寫clone方法。在這裡解釋一下什麼是淺複製,所謂的淺複製就是說當物件中存在引用型別的變數,淺複製是不會根據引用型別重新構建一個新的物件,然後引用的,他只會將引用型別的變數的值複製過來。通俗點來說就是:如果你改變淺複製的物件的引用型別的資料,被複制的引用型別的資料也會改動。
常用的方法
//這個方法如果不覆蓋,那麼就會呼叫object類中的toString方法,
public String toString(){
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
//比較兩個物件的地址值是否相同,在這裡需要說明一點的是:
//在String類中有這樣一個說法:“==”是比較地址的值,equals方法是比較內容。
//這個說法是沒有錯的,但是忽略的一個前提條件,String類覆蓋了equals方法
//我想說的一點是:如果一個類中沒有覆蓋equals方法,那麼使用equals方法也是比較地址值的。
public boolean equals(Object obj){
return (this == obj)
}
其他的方法
// 垃圾回收器在認為該物件是垃圾物件的時候會呼叫該方法。
//子類可以通過重寫該方法來達到資源釋放的目的。
// 在方法呼叫過程中出現的異常會被忽略且方法呼叫會被終止。
//任何物件的該方法只會被呼叫一次。
protected void finalize()
Object 涉及的涉及模式
看了一遍原始碼之後,沒有發現有什麼設計模式
學習Object後的感想
Object是java中的所有類的基類,記得當時我學習Java的時候,對於這個類的印象是:上帝,就這兩個字了。現在明白其實Object被設計出來就是讓所有的類都具備一個類的必備的方法,讓程式設計師涉及類的時候不必寫這些程式碼(需要覆蓋的除外)。明白了Object中的很多方法是使用c、c++寫的,也知道了類的深淺複製,以及類的基礎方法。