Object類分析

Obejct類是所有類的父類,所有的類都繼承與它,定義時不需要顯示繼承,JAVA類默認繼承與Obejct。

位於JDK自帶的rt.jar包中的java.lang包。

Object類中定義了一些方法,實際開發中常常會調用或者對部分方法進行重寫,方法如下:

1、hashCode():

hashCode是jdk根據對象的地址或者字符串或者數字等,按照一定的算法,算出來的int類型的數值。主要應用於集合中,實現集合的快速查詢等操作。

該方法返回該對象的hash值,爲int類型,同一個對象的hashCode在不同時期調用,計算的結果要求保持一致。

實際應用中,該方法常常被重寫。

2、equals():

用於比較兩個對象是否相同,默認比較的是引用地址是否相同。在Object類中該方法於“==”效果相同,都是比較內存中的引用地址,官方建議,每個類都重寫equals()方法。

注意:引用類型數據比較的是引用,即內存地址,基本數據類型比較的是值。返回值爲boolean類型。
Obejct中代碼如下:

public boolean equals(Object obj) {
        return (this == obj);
}

重寫equals()方法,以Integer類爲例,代碼如下:

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
}

實際應用中,該方法常常被重寫。

3、toString():

返回對象的字符串表達形式,返回類型很明顯就是String。

Obejct中該方法返回類型和hashCode地址值,代碼如下:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

實際應用中,該方法常常被重寫。

4、clone():

該方法用於對象的克隆,創建一個新的對象。

注意:clone()方法創建的對象爲淺表複製,新創建的對象與原始對象引用地址相同,也就是說,新創建的對象與原始對象是同一個,當一個對象修改時,另一個對象也會隨着修改。

clone()方法返回會拋出CloneNotSupportedException異常,調用時需要進行處理。

5、notify():

該方法用於喚醒被這個對象的monitor標記等待的線程,如果線程的數量大於1,那麼被喚醒的線程是由VM自行決定的。注意被喚醒的線程不一定立即執行,至少要等待當前調用notify的線程釋放這個對象的monitor,或者等待其他正好同步鎖定該對象的線程釋放了該對象。 當然了,也不是任何地方都可以調用notify的,調用的地方必須持有對象的monitor,可以有以下幾種情況:1.在一個同步( synchronized)方法中;2.在一段該對象的同步代碼塊中;3.如果這個變量是類變量(static),同步的靜態方法也持有。

6、notifyAll():

該方法與notify()方法功能相似,只是該方法喚醒全部線程,但是喚醒的線程不是立即執行。

7、wait():

通知當前線程掛起,當對象的notify或者notifyAll被調用的時候纔會被重新喚醒,wait了的thread是可以被中斷(interrupt)的。當線程wait的時候,這個線程其實丟失了對象的monitor,當被notify的時候,會在程序執行前重新請求到對象的monitor。

wait()方法另有兩個重載方法wait(long timeout)和wait(long timeout, int nanos),wait()方法默認timeout爲0,表示沒有超時時間。timeout時間不能小於0,否則會報IllegalArgumentException異常;當timeout大於0,表示指明瞭該線程wait等待的時間,如果這個時間段內該線程沒有被喚醒,那麼時間到了以後,該線程也會自動喚醒。

代碼如下:

public final void wait() throws InterruptedException {
        wait(0);
}

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);
}

8、finalize():

垃圾回收器在回收某一個對象之前,會先調用該方法,做掃尾操作,當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。

此方法一般不需要我們調用。

9、getClass():

返回當前對象的真實類型。

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