Object類:品讀API

學了好久Java,卻還沒仔細研讀過Object類,實爲遺憾,今日讀下,在此記之。

java.lang.Object 即Object類位於java.lang包。

public class Object

        Object類是一切類的根(始祖),即Object類是每個類的超類(父類),所有的類,包括數組都實現了該類中的方法。此類自JDK1.0就有了。

構造對象,只提供了一個空參構造對象(沒有重載),去看源碼,發現源碼中沒有給出。這似乎符合Java的規則,Java中構造函數不可以被繼承(只是隱式或顯式調用),而當某個類沒有自定義構造函數時,java會默認添加一個空參構造函數,這應該就是隱式地調用了父類的構造函數。

protected Object clone() 創建並返回此對象的一個副本。

    protected native Object clone() throws CloneNotSupportedException;
boolean equals(object obj) 判斷其他對象是否等於當前對象,一般子類都會重寫此方法來實現自己的功能。

    public boolean equals(Object obj) {
        return (this == obj);
    }
有一些面試題會問到equals()方法與==有什麼不同。

protected void finalize() 被GC(垃圾收集器)調用,當GC發現該對象沒有引用時。這個地方,有兩個很有趣的地方,一是告訴了我們GC的工作原理,當一個對象不再有引用時,GC就將其回收,二是體現了面向對象的思想,只有對象本身知道自己的情況,外部想要實現功能,就要通過對象來調用。

    protected void finalize() throws Throwable { }

Class<?> getClass(),返回此對象的運行時類。這個方法跟泛型有點關係(<?>),而且返回值類型就是Class。詳細Class類介紹請看深入理解Class類

public final native Class<?> getClass();

int hashCode() 返回當前對象的哈希值。equals方法比較就是比較的哈希值,更多hashCode請參考wikipedia之java hashCode

    public native int hashCode();
void notify() 喚醒一個等待當前對象監視器的線程。當某個線程以此對象爲鎖時,調用notify方法,可將其喚醒,給予其競爭執行權的資格。
    public final native void notify();
void notifyAll() 喚醒所有等待當前對象監視器的線程,字面意思理解即可。

    public final native void notifyAll();
String toString() 返回該對象的字符串表達式。當我們打印一個對象時,打印的內容即時調用此方法後得到的字符串表達式。

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
它就是返回“類名@hashCode(十六進制)”。
void wait()

void wait(long timeout)

void wait(long timeout, int nanos)

重載了三個不同參數列表的wait()方法,用來使當前線程停下來,直到notify()或者notifyAll()信號發出。


去參照源碼,發現還是有些地方API document裏面沒提到的。


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

首先聲明瞭一個私有的,靜態的,本地的方法,然後調用靜態代碼塊執行,注意本地方法是與平臺有關的,與其他編程語言有關的。靜態代碼塊的執行順序優於構造函數,原因是靜態代碼塊隨類加載而執行,構造函數只有實例化對象的時候纔開始執行。


還有一個很有趣的地方是,Object類是非abstract類,而Object類是所有類的超類,說明abstract類也繼承了Object類,進而說明abstract類可以繼承具體類。


希望能做個有心人,從不同角度看問題,發現問題的多維面。







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