1. 程式人生 > >Object原始碼解析(JDK1.8)

Object原始碼解析(JDK1.8)

在這裡插入圖片描述

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 {
    }
}

轉自:https://www.cnblogs.com/wupeixuan/p/8620217.html