Java筆記1:Object類源碼

Object類是Java類層次結構的根節點,定義了一些最抽象的方法。

registerNatives()

private static native void registerNatives();

static {
    registerNatives();
}

       是一個本地方法,並且該方法在靜態代碼塊中,因此所有對象在創建時,都會先調用該方法。該方法的主要作用就是將其他語言實現的(主要是C/C++)一些環境相關的方法映射到Java中的本地方法,實現方法名的解耦。

getClass()

public final native Class<?> getClass();

       該方法也是一個本地方法,返回該對象的運行時類型,不可重寫。返回的Class對象的具體類型爲Class<? extends X>,其中X是變量調用該方法的變量的被擦除的靜態類型。

hashCode()

public native int hashCode();

       返回值爲對象的哈希值,用於支持哈希表。對於該方法的返回值,有一些通用的約定:

  • 在同一個Java應用中調用同一個對象的hashCode()函數,只要equals()方法中比較的信息沒有改變,那麼無論調用多少次,返回值都應該是相等的。
  • 如果根據equals()方法,兩個對象是相等的,那麼這兩個對象的哈希值也應該是相等的。
  • 雖然並沒有要求兩個不相等的對象(根據equals()方法)的哈希值必須不等,但是程序應該保證哈希值儘量稀疏以提高哈希表的性能。

equals()

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

       用於比較另一個對象是否與當前對象“相等”,可由子類重寫。該方法應具有自反性,傳遞性,對稱性,冪等性。在Object類中的默認實現比較的內存地址,即只有當兩個變量指向同一個對象時該方法才返回true,在實際應用時通常需要重寫該方法以保證邏輯上的正確性。

clone()

protected native Object clone() throws CloneNotSupportedException;

       創建並返回該對象的拷貝,“拷貝”的準確含義與該對象的類型有關。通常來說,該方法應該使得x.clone() != xx.clone().getClass() == x.getClass()x.clone().equals(x)的結果均爲true,但是並不是強制的要求。
       該方法對對象實現的是“淺拷貝(shallow copy)”,而非“深拷貝(deep copy)”

  • 淺拷貝:對基本數據類型進行值傳遞,對引用數據類型進行引用傳遞般的拷貝,此爲淺拷貝。
  • 深拷貝:對基本數據類型進行值傳遞,對引用數據類型,創建一個新的對象,並複製其內容,此爲深拷貝。

       對於一個具體類,如果想要調用其clone()方法,該類需要實現Clonable接口,否則會拋出CloneNotSupportedException異常。

toString()

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

       發揮該對象的字符串表示,通常該字符串是對該對象的一個簡明、易讀的總結,所有的子類都應該重寫該方法。Object類中的toString()方法的返回值格式是:類型名@哈希值,其中哈希值是十六進制表示。

notify(), notyfyAll()

public final native void notify();
public final native void notifyAll();

       notify()隨機喚醒一個等待該對象的線程,notifyAll()喚醒全部等待該對象的線程。線程如果想要調用這兩個方法,必須擁有該對象的監視器,線程可以通過以下幾種方法擁有對象的監視器:

  • 執行對象的synchronized實例方法
  • 執行一個synchronized代碼塊,用該對象作爲同步對象
  • 如果是一個Class對象,那麼只要執行一個該類的同步靜態方法

wait(long timeout), wait(long timeout, int nanos), wait()

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

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

       讓線程進入等待狀態,直到其他線程調用了該對象的notify()方法或者nitifyAll()方法或者經過了一定的時長。

finalize()

protected void finalize() throws Throwable { }

       當垃圾回收器(Garbage Collector)確定不再有對該對象的引用時,由垃圾回收器在對象上調用該方法。該方法只會被調用一次。
Object類是Java類層次結構的根節點,定義了一些最抽象的方法。

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