Object 源碼閱讀

Object 源碼閱讀

/**
 *  Object 類是類繼承結構的根類,每一個類型都以 Object 作爲其父類,包括數組。
 */
public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }

    /**
     *  創建一個新的對象
     */
    @HotSpotIntrinsicCandidate
    public Object() {}

    /**
     *  返回此對象的目標 Class 對象
     */
    @Override
    @HotSpotIntrinsicCandidate
    public final native Class<?> getClass();

    /**
     *  返回此對象的哈希值
     *  如果兩個對象的 equals(Object) 方法返回 true,則它們的哈希值必須相等。
     */
    @Override
    @HotSpotIntrinsicCandidate
    public native int hashCode();

    /**
     *  此對象是否和目標對象 obj 相等
     * 1)反射性:對於任何非空引用 x,x.equals(x) 應該返回 true。
     * 2)對稱性:對於任何非空引用 x、y,如果 x.equals(y) 返回 true,則 y.equals(x) 也應該返回 true。
     * 3)傳遞性:對於任何非空引用 x、y、z,如果 x.equals(y) 和 y.equals(z) 返回 true,則 x.equals(z) 也應該返回 true。
     * 4)一致性:對於任何非空引用 x、y,則多次調用 x.equals(y) 應該一致地返回 true 或 false。
     * 5)對於任何非空引用,x.equals(null) 應該返回 false。
     *  如果重寫了 equals 方法,則必須重寫 hashcode 方法。
     */
    public boolean equals(Object obj) {
        return this == obj;
    }

    /**
     *  克隆此對象
     *
     * 1)x.clone() != x 應該返回 true
     * 2)x.clone().getClass() == x.getClass() 應該返回 true
     * 3)x.clone().equals(x) 應該返回 true
     */
    @Override
    @HotSpotIntrinsicCandidate
    protected native Object clone() throws CloneNotSupportedException;

    /**
     *  返回此對象的字符串表示。
     *  默認值 getClass().getName() + '@' + Integer.toHexString(hashCode())
     */
    @Override
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    /**
     *  隨機喚醒一個在此對象監視器上阻塞等待的線程。
     *  1)只有當目標線程放棄此對象的監視器時,被喚醒的線程才能正常執行。
     *  2)此方法調用之前,目標線程必須先獲得此對象的監視器,
     *      調用此對象的同步方法
     *      通過 synchronized(obj){} 同步代碼塊獲取此對象的監視器
     *      如果是 Class 類型,則可以調用此類型的靜態同步方法
     *  3)任何時刻,只能有一個線程擁有此對象的監視器
     */
    @Override
    @HotSpotIntrinsicCandidate
    public final native void notify();

    /**
     *  喚醒所有在此對象的監視器上阻塞等待的線程
     *  1)只有當目標線程放棄此對象的監視器時,被喚醒的線程才能正常執行。
     *  2)此方法調用之前,目標線程必須先獲得此對象的監視器,
     *      調用此對象的同步方法
     *      通過 synchronized(obj){} 同步代碼塊獲取此對象的監視器
     *      如果是 Class 類型,則可以調用此類型的靜態同步方法
     *  3)任何時刻,只能有一個線程擁有此對象的監視器
     */
    @Override
    @HotSpotIntrinsicCandidate
    public final native void notifyAll();

    /**
     *  讓當前線程在此對象的監視器上阻塞等待,直到被喚醒或被中斷。
     *  1)此方法調用之前,目標線程必須先獲得此對象的監視器,
     *      調用此對象的同步方法
     *      通過 synchronized(obj){} 同步代碼塊獲取此對象的監視器
     *      如果是 Class 類型,則可以調用此類型的靜態同步方法
     */
    @Override
    public final void wait() throws InterruptedException {
        wait(0L);
    }

    /**
     *  讓當前線程在此對象的監視器上阻塞等待,直到被喚醒、被中斷、阻塞等待超時。
     *  1)此方法調用之前,目標線程必須先獲得此對象的監視器,
     *      調用此對象的同步方法
     *      通過 synchronized(obj){} 同步代碼塊獲取此對象的監視器
     *      如果是 Class 類型,則可以調用此類型的靜態同步方法
     *
     * @param timeout   阻塞等待的毫秒數
     */
    @Override
    public final native void wait(long timeout) throws InterruptedException;

    /**
     *  讓當前線程在此對象的監視器上阻塞等待,直到被喚醒、被中斷、阻塞等待超時。
     *  1)此方法調用之前,目標線程必須先獲得此對象的監視器,
     *      調用此對象的同步方法
     *      通過 synchronized(obj){} 同步代碼塊獲取此對象的監視器
     *      如果是 Class 類型,則可以調用此類型的靜態同步方法
     *
     * @param timeout   阻塞等待的毫秒數
     * @param nanos     納秒增量
     */
    @Override
    public final void wait(long timeout, int nanos) throws InterruptedException {
        // 1)超時時間爲負數
        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);
    }

    /**
     *  垃圾回收器將調用此方法執行此對象的垃圾回收,
     *  1)調用時機不確定
     *  2)只能調用一次
     *  3)不建議覆蓋此方法執行資源釋放
     *  4)如果此方法拋出異常,則該異常將被忽略,如果在此方法中執行資源釋放,則可能導致資源泄漏
     * <p>
     */
    @Override
    @Deprecated(since="9")
    protected void finalize() throws Throwable { }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章