Object原始碼解析(JDK1.8)
阿新 • • 發佈:2018-11-30
package java.lang; public class Object { /** * 一個本地方法,具體是用C(C++)在DLL中實現的,然後通過JNI呼叫 */ private static native void registerNatives(); /** * 物件初始化時自動呼叫此方法 */ static { registerNatives(); } /** * 返回此Object的執行時類 */ public final native Class<?> getClass(); /** * hashCode的常規協定是: * 1.在java應用程式執行期間,在對同一物件多次呼叫hashCode()方法時,必須一致地返回相同的整數,前提是將物件進行equals比較時所用的資訊沒有被修改。 * 從某一應用程式的一次執行到同一應用程式的另一次執行,該整數無需保持一致。 * 2.如果根據equals(object)方法,兩個物件是相等的,那麼對這兩個物件中的每個物件呼叫hashCode方法都必須生成相同的整數結果。 * 3.如果根據equals(java.lang.Object)方法,兩個物件不相等,那麼對這兩個物件中的任一物件上呼叫hashCode()方法不要求一定生成不同的整數結果。 * 但是,程式設計師應該意識到,為不相等的物件生成不同整數結果可以提高雜湊表的效能。 */ public native int hashCode(); /** * 這裡比較的是物件的記憶體地址 */ public boolean equals(Object obj) { return (this == obj); } /** * 本地clone方法,用於物件的複製 */ protected native Object clone() throws CloneNotSupportedException; /** * 返回該物件的字串表示,非常重要的方法 * getClass().getName();獲取位元組碼檔案的對應全路徑名例如java.lang.Object * Integer.toHexString(hashCode());將雜湊值轉成16進位制數格式的字串。 */ public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } /** * 不能被重寫,用於喚醒一個在因等待該物件(呼叫了wait方法)被處於等待狀態(waiting 或 time_wait)的執行緒,該方法只能同步方法或同步塊中呼叫 */ public final native void notify(); /** * 不能被重寫,用於喚醒所有在因等待該物件(呼叫wait方法)被處於等待狀態(waiting或time_waiting)的執行緒,該方法只能同步方法或同步塊中呼叫 */ public final native void notifyAll(); /** * 不能被重寫,用於線上程呼叫中,導致當前執行緒進入等待狀態(time_waiting),timeout單位為毫秒,該方法只能同步方法或同步塊中呼叫,超過設定時間後執行緒重新進入可執行狀態 */ public final native void wait(long timeout) throws InterruptedException; public final void wait(long timeout, int nanos) throws InterruptedException { if (timeout < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos > 0) { timeout++; } wait(timeout); } /** * 在其他執行緒呼叫此物件的notify()方法或notifyAll()方法前,導致當前執行緒等待。換句話說,此方法的行為就好像它僅執行wait(0)呼叫一樣。 * 當前執行緒必須擁有此物件監視器。 * 該執行緒釋出對此監視器的所有權並等待,直到其他執行緒通過呼叫notify方法或notifyAll方法通知在此物件的監視器上等待的執行緒醒來, * 然後該執行緒將等到重新獲得對監視器的所有權後才能繼續執行。 */ public final void wait() throws InterruptedException { wait(0); } /** * 這個方法用於當物件被回收時呼叫,這個由JVM支援,Object的finalize方法預設是什麼都沒有做,如果子類需要在物件被回收時執行一些邏輯處理,則可以重寫finalize方法。 */ protected void finalize() throws Throwable { } }