Object源碼解析(JDK1.8)

  1 package java.lang;
  2 
  3 
  4 public class Object {
  5 
  6     /**
  7      * 一個本地方法,具體是用C(C++)在DLL中實現的,而後經過JNI調用
  8      */
  9     private static native void registerNatives();
 10 
 11     /**
 12      * 對象初始化時自動調用此方法
 13      */
 14     static {
 15         registerNatives();
 16     }
 17 
 18     /**
 19      * 返回此Object的運行時類
 20      */
 21     public final native Class<?> getClass();
 22 
 23     /**
 24      * hashCode的常規協定是:
 25      * 1.在java應用程序執行期間,在對同一對象屢次調用hashCode()方法時,必須一致地返回相同的整數,前提是將對象進行equals比較時所用的信息沒有被修改。
 26      * 從某一應用程序的一次執行到同一應用程序的另外一次執行,該整數無需保持一致。
 27      * 2.若是根據equals(object)方法,兩個對象是相等的,那麼對這兩個對象中的每一個對象調用hashCode方法都必須生成相同的整數結果。
 28      * 3.若是根據equals(java.lang.Object)方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用hashCode()方法不要求必定生成不一樣的整數結果。
 29      * 可是,程序員應該意識到,爲不相等的對象生成不一樣整數結果能夠提升哈希表的性能。
 30      */
 31     public native int hashCode();
 32 
 33     /**
 34      * 這裏比較的是對象的內存地址
 35      */
 36     public boolean equals(Object obj) {
 37         return (this == obj);
 38     }
 39 
 40     /**
 41      * 本地clone方法,用於對象的複製
 42      */
 43     protected native Object clone() throws CloneNotSupportedException;
 44 
 45     /**
 46      * 返回該對象的字符串表示,很是重要的方法
 47      * getClass().getName();獲取字節碼文件的對應全路徑名例如java.lang.Object
 48      * Integer.toHexString(hashCode());將哈希值轉成16進制數格式的字符串。
 49      */
 50     public String toString() {
 51         return getClass().getName() + "@" + Integer.toHexString(hashCode());
 52     }
 53 
 54     /**
 55      * 不能被重寫,用於喚醒一個在因等待該對象(調用了wait方法)被處於等待狀態(waiting 或 time_wait)的線程,該方法只能同步方法或同步塊中調用
 56      */
 57     public final native void notify();
 58 
 59     /**
 60      * 不能被重寫,用於喚醒全部在因等待該對象(調用wait方法)被處於等待狀態(waiting或time_waiting)的線程,該方法只能同步方法或同步塊中調用
 61      */
 62     public final native void notifyAll();
 63 
 64     /**
 65      * 不能被重寫,用於在線程調用中,致使當前線程進入等待狀態(time_waiting),timeout單位爲毫秒,該方法只能同步方法或同步塊中調用,超過設置時間後線程從新進入可運行狀態
 66      */
 67     public final native void wait(long timeout) throws InterruptedException;
 68 
 69 
 70     public final void wait(long timeout, int nanos) throws InterruptedException {
 71         if (timeout < 0) {
 72             throw new IllegalArgumentException("timeout value is negative");
 73         }
 74 
 75         if (nanos < 0 || nanos > 999999) {
 76             throw new IllegalArgumentException(
 77                     "nanosecond timeout value out of range");
 78         }
 79 
 80         if (nanos > 0) {
 81             timeout++;
 82         }
 83 
 84         wait(timeout);
 85     }
 86 
 87     /**
 88      * 在其餘線程調用此對象的notify()方法或notifyAll()方法前,致使當前線程等待。換句話說,此方法的行爲就好像它僅執行wait(0)調用同樣。
 89      * 當前線程必須擁有此對象監視器。
 90      * 該線程發佈對此監視器的全部權並等待,直到其餘線程經過調用notify方法或notifyAll方法通知在此對象的監視器上等待的線程醒來,
 91      * 而後該線程將等到從新得到對監視器的全部權後才能繼續執行。
 92      */
 93     public final void wait() throws InterruptedException {
 94         wait(0);
 95     }
 96 
 97     /**
 98      * 這個方法用於當對象被回收時調用,這個由JVM支持,Object的finalize方法默認是什麼都沒有作,若是子類須要在對象被回收時執行一些邏輯處理,則能夠重寫finalize方法。
 99      */
100     protected void finalize() throws Throwable {
101     }
102 }
相關文章
相關標籤/搜索