JDK軟件包1.8java.lang之Object

Object(超類),是類層次結構的根。所有類都把Object作爲超類。所有對象都實現類了該類的方法。Java1.0起始版本都定義了該類。

方法:

       Object clone();對象的複製copy

       Class<?> getClass(); 返回實例對象所屬類的信息。

       boolean equals(); 判斷非空對象是否相等。

對於非空的對象X、Y、Z,存在4個特性:

自反性,X.equals(X),返回true,自己跟自己比較,自反性;

對稱性,X.equals(Y)與Y.equals(X)返回結果同時爲true;

傳遞性,X.equals(Y) 返回true,Y.equals(Z)返回true時,X.equals(Z)也返回true;

一致性,對象信息沒有修改的情況下,多次調用equals()方法返回結果相同;

任何非空對象與null判斷是否相等,都返回false。

此方法重寫時,必須重寫hashcode方法;hashcode方法協定要求,對象判斷相等,必須hashcode相等。

       int hashCode();返回哈希編碼

返回對象的哈希碼值,該方法是爲了提高哈希表的性能。哈希碼的協定:java應用程序運行期間,對同一個對象多次調用hashCode方法時,必須一致地返回相同的整數,前提是將對象進行equals比較時所有的信息沒有被修改。對象equals方法比較相等,那麼hash值一定相等。若比較不相等,那麼hash值不一定不相等,但是爲了提高性能,編碼的時候不相等的對象,哈希碼最好不要相等。Object類定義的hashCode確實針對不通的對象返回不同的哈希值。

void finalize();垃圾回收器確定對象不在有任何引用時(不可達),由對象的垃圾回收器調用此方法。在不可撤銷丟棄對象之前,執行清除操作。

  String toString();返回該對象的字符串表示。結果應該是一個建議明瞭的信息表達,建議所有子類重寫此方法。

void wait();final修飾的方法不能被重寫。在除當前線程外的其他線程調用notify() /notifyAll() 方法前,讓當前線程等待。當前現場必須擁有 此對象的監視器。與wati(0)、wait(0,0)相等。

void wait(long timeout);final修飾的方法不能被重寫。按毫秒時間等待

void wait(long timeout, int nanos);final修飾的方法不能被重寫。增加納秒級別的等待精度,也是就是毫秒時間加1;1毫秒等於1000000納秒,所以傳入的納秒值不能大於999999。

監視器:jvm對每個對象和Class都設置了一個監聽器,發現和檢測併發代碼的衝入。當線程訪問受保護的對象數據時,先要獲取對象監視器的所有權,然後才能獲取對象數據。所有因爲獲取監視器所有權等待的線程和當前線程,通過CPU調度競爭上崗獲取所有權。然後執行受保護的代碼,執行完畢後釋放Monitor所有權。如果有線程持有對象監視器的所有權,那麼其他線程等待(進入等待entry-set)。當一個線程獲取對象監視器所有權之後,經過代碼執行沒有達到條件要求,那麼需要調用Object的wait方法,線程會釋放對象監視器的所有權,進入等待線程隊列(wait-set),等待Object的notify方法喚醒,然後和其他線程通過CPU競爭獲取對象監視器所有權。

void notify();final修飾的方法不能被重寫。喚醒在此對象監視器上的等待線程(因爲某種條件或原因,調用wait,然後釋放了監視器所有權的線程)(1個),如果有很多等待的線程,隨機喚醒一個。被喚醒的線程繼續參加對象監視器所有權競爭。

void notify();final修飾的方法不能被重寫。喚醒在此對象監視器上所有等待的線程。

 

package java.lang;


public class Object {

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

    /**
     * 返回對象所屬類的信息。類名稱、類方法、變量等
     */
    public final native Class<?> getClass();

    /**
     * 生成對象的哈希碼值,equals相同的對象,有相同的哈希碼;不相同的對象,儘量有不相同的哈希碼
     */
    public native int hashCode();

    /**
     * 判斷非空對象是否相等
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }

    /**
     * 創建對象的副本並返回這個副本
     */
    protected native Object clone() throws CloneNotSupportedException;

    /**
     * 返回對象的簡明的描述字符串
     */
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    /**
     * 喚醒在此對象監視器上等待線程的隨機一個。
     */
    public final native void notify();

    /**
     * 喚醒在此對象監視器上所有等待的線程。
     */
    public final native void notifyAll();

    /**
     * 等待一定量的時間,如果timeout是0,不考慮超時時間
     * 解除等待的方法:notify(),喚醒的包含當前線程;notifyAll()喚醒所有線程;其他線程中斷指定
     * 線程;到達等待的時間。
     */
    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");
        }
        //自動加1
        if (nanos > 0) {
            timeout++;
        }

        wait(timeout);
    }
    /**
     * 獲得對象監視器所有權的當前線程等待
     */
    public final void wait() throws InterruptedException {
        wait(0);
    }

    /**
     * 撤回丟棄對象前的清楚工作
     */
    protected void finalize() throws Throwable { }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章