學了好久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類可以繼承具體類。
希望能做個有心人,從不同角度看問題,發現問題的多維面。