1. 程式人生 > >基礎 | Object類詳解

基礎 | Object類詳解

「Object類有哪些方法?每個方法分別有什麼作用?」 是面試「Java開發工程師」過程中的高頻問題,我在參加海康威視和VIVO的秋招面試中均被問到過,在此進行一個系統的總結與梳理。


參考答案

Object類位於java.lang包下,是Java中所有類的始祖,其包含的方法列表如下:

各方法的具體說明如下:

Object(): Object類中並沒有顯式宣告該構造方法,其是由編譯器自動為其建立的一個不帶引數的預設構造器。

registerNatives(): 用於註冊本地方法,即將本地用C/C++實現的方法對映到Java中的本地(native)方法,實現方法命名的解耦。

getClass(): 用於獲取此Object的執行時類物件,執行時類是 Java 反射機制的源頭。

hashCode(): 用於返回物件的雜湊值,雜湊值是一個可正可負的整數值。

equals(): 用於判斷兩個物件的引用是否相等,而實際開發中常需要重寫該方法以比較兩個物件的具體內容是否相等。

clone(): 用於建立並返回此物件的一個副本,其實質上是一種「淺拷貝」。

toString(): 用於返回該物件的字串表示,建議所有子類均重寫該方法,以返回該物件中各屬性值的字串表示。

notify(): 用於喚醒一個在此物件監視器上等待的執行緒,由JVM決定喚醒哪個等待執行緒,與執行緒的優先順序無關。

notifyAll(): 用於喚醒所有在此物件監視器上等待的執行緒,該方法並不是將物件的鎖給所有執行緒,而是讓它們競爭,只有獲得鎖的執行緒才能進入就緒狀態。

wait(long timeout): 導致當前執行緒釋放所持有物件的鎖(執行緒暫停執行),進入在物件監視器上等待的狀態,直到達到最長等待時間(timeout)或其他執行緒呼叫notify()或notifyAll()方法。

wait(long timeout, int nanos): 最長等待時間為「1000000 * timeout + nanos」。

wait(): 未指定最長等待時間。

finalize(): 垃圾回收器在準備回收物件前,會先呼叫該方法;子類可通過重寫該方法,以在垃圾回收前整理系統資源或執行其他清理操作。


原始碼閱讀


package java.lang;

public class Object {

	/**
	 * 私有的,在靜態程式碼塊中執行,且僅在Object類首次被載入時執行一次。
	 */
    private static native void registerNatives();
    static {
        registerNatives();
    }

    /**
     * final方法:不能被子類所重寫
     */
    public final native Class<?> getClass();

    /**
     * 在子類中重寫該方法時,可直接呼叫Objects.hash(Object...)來獲取物件的雜湊值
     */
    public native int hashCode();

    /**
     * 預設實現中,僅比較兩個物件是否引用的同一個物件
     * 實際開發中,需要重寫該方法來比較兩個物件的具體內容是否相等
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }

    /**
     * 僅對本包下的所有類和當前類的子類可見。
     * 只有實現Cloneable介面的類的物件才能呼叫該方法,否則會丟擲異常
     */
    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();

    /**
     * 使當前執行緒釋放物件鎖,即執行緒暫停執行,直到其他執行緒呼叫notify()/notifyAll()方法或達到timeout
     */
    public final native void wait(long timeout) throws InterruptedException;

    /**
     * 最大等待時間:1000000*timeout+nanos
     */
    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);
    }

    /**
     * 未設定最大等待時間,即只能被notify()/notifyAll()喚醒
     */
    public final void wait() throws InterruptedException {
        wait(0);
    }

    /**
     * 子類可通過重寫該方法,以在垃圾回收前整理系統資源或執行其他清理操作
     * 在該方法中,若將該物件重新與引用鏈建立關聯關係,則會逃離本次垃圾回收
     */
    protected void finalize() throws Throwable { }
}


推薦閱讀


歡迎關注

Java名企面試吧,每天10點24分,我們不見不散!

丙子先生的宗旨是,每天以短篇幅講高頻面試題,不增加太多負擔,但需要持之以恆。

能力有限,歡迎指教!