JDK源碼之Object類詳解(一)

package java.lang;

/**
 * Object類是類層次結構中的根,每個類的父類都是Object類。
 * 所有對象,包括數組,都實現了這個類的方法。
 */
public class Object {

    /**
     * registerNatives函數前面有native關鍵字修飾,
     * Java,native關鍵字修飾的函數表明該方法的實現並不是在Java中去完成,
     * 而是由C/C++去完成,並被編譯成了.dll,Java去調用
     * 一個本地方法,具體是用C(C++)DLL中實現的,然後通過JNI調用
     */
    private static native void registerNatives();

    /**
     * registerNatives()修飾符爲private,且並沒有執行,
     * registerNatives()方法是在靜態代碼塊中執行的
     */
    static {
        registerNatives();
    }

    /**
     * 返回運行時的類名
     */
    public final native Class<?> getClass();

    /**
     * 1.java應用程序執行期間,在對同一對象多次調用hashCode()方法時,
     * 必須一致地返回相同的整數,前提是將對象進行equals比較時所用的信息沒有被修改。
     * 從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。
     * 2.如果根據equals(object)方法,兩個對象是相等的,
     * 那麼對這兩個對象中的每個對象調用hashCode方法都必須生成相同的整數結果。
     * 3.如果根據equals(java.lang.Object)方法,
     * 兩個對象不相等,那麼對這兩個對象中的任一對象上調用hashCode()方法不要求一定生成不同的整數結果。
     * 但是,程序員應該意識到,爲不相等的對象生成不同整數結果可以提高哈希表的性能。
     * hashCode()用於獲取對象的哈希值,這個值的作用是檢索,具體的作用可以參考這裏
     */
    public native int hashCode();

    /**
     * equale()用於確認兩個對象是否相同。
     * 哈希值相同的對象不一定equale()true
     * equale()返回true的兩個對象一定相同。
     * 這裏比較的是對象的內存地址,
     * String.equals方法不同,它比較的只是對象的值
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }

    /**
     * 本地clone方法,用於對象的複製
     * clone函數返回的是一個引用,指向的是新的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());
    }

    /**
     * 在使用的時候要求在synchronize語句中使用
     * 喚醒在該對象的監視器上等待的單個線程
     */
    public final native void notify();

    /**
     * 在使用的時候要求在synchronize語句中使用
     * 喚醒在該對象的監視器上等待的所有線程
     */
    public final native void notifyAll();

    /**
     * 在使用的時候要求在synchronize語句中使用
     * 在其他線程調用此對象的notify()方法或notifyAll()方法前,導致當前線程等待。
     * 換句話說,此方法的行爲就好像它僅執行wait(0)調用一樣。
     * 當前線程必須擁有此對象監視器。該線程發佈對此監視器的所有權並等待,
     * 直到其他線程通過調用notify方法或notifyAll方法通知在此對象的監視器上等待的線程醒來,
     * 然後該線程將等到重新獲得對監視器的所有權後才能繼續執行。
     */
    public final native void wait(long timeout) throws InterruptedException;

    /**
     * 在使用的時候要求在synchronize語句中使用
     * 讓當前線程等待直到另一個線程調用了此對象的notify()notifyAll()方法,
     * 或者其他某個線程中斷了當前線程,或者過去了一定的時間
     * nanos不能大於等於1000000ms也就是1000s
     */
    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);
    }

    /**
     * 在使用的時候要求在synchronize語句中使用
     * 在其他線程調用此對象的notify()方法或notifyAll()方法前,導致當前線程等待。
     * 換句話說,此方法的行爲就好像它僅執行wait(0)調用一樣。
     * 當前線程必須擁有此對象監視器。該線程發佈對此監視器的所有權並等待,
     * 直到其他線程通過調用notify方法或notifyAll方法通知在此對象的監視器上等待的線程醒來,
     * 然後該線程將等到重新獲得對監視器的所有權後才能繼續執行。
     */
    public final void wait() throws InterruptedException {
        wait(0);
    }

    /**
     * 當垃圾回收器確定該對象沒有被引用時,調用此方法
     */
    protected void finalize() throws Throwable { }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章