package java.lang; /** * Object類是類層次結構中的根,每個類的父類都是Object類。 * 所有對象,包括數組,都實現了這個類的方法。 */ public class Object { /** * registerNatives函數前面有native關鍵字修飾, * Java中,用native關鍵字修飾的函數表明該方法的實現並不是在Java中去完成, * 而是由C/C++去完成,並被編譯成了.dll,由Java去調用 * 一個本地方法,具體是用C(C++)在DLL中實現的,然後通過JNI調用 */ private static native void registerNatives(); /** * registerNatives()修飾符爲private,且並沒有執行, * registerNatives()方法是在靜態代碼塊中執行的 */ static { registerNatives(); } /** * 返回運行時的類名 */ public final native Class<?> getClass(); /** * 1.在java應用程序執行期間,在對同一對象多次調用hashCode()方法時, * 必須一致地返回相同的整數,前提是將對象進行equals比較時所用的信息沒有被修改。 * 從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。 * 2.如果根據equals(object)方法,兩個對象是相等的, * 那麼對這兩個對象中的每個對象調用hashCode方法都必須生成相同的整數結果。 * 3.如果根據equals(java.lang.Object)方法, * 兩個對象不相等,那麼對這兩個對象中的任一對象上調用hashCode()方法不要求一定生成不同的整數結果。 * 但是,程序員應該意識到,爲不相等的對象生成不同整數結果可以提高哈希表的性能。 * hashCode()用於獲取對象的哈希值,這個值的作用是檢索,具體的作用可以參考這裏 */ public native int hashCode(); /** * equale()用於確認兩個對象是否相同。 * 哈希值相同的對象不一定equale()爲true * equale()返回true的兩個對象一定相同。 * 這裏比較的是對象的內存地址, * 跟String.equals方法不同,它比較的只是對象的值 */ public boolean equals(Object obj) { return (this == obj); } /** * 本地clone方法,用於對象的複製 * clone函數返回的是一個引用,指向的是新的clone出來的對象, * 此對象與原對象分別佔用不同的堆空間。 */ protected native Object clone() throws CloneNotSupportedException; /** * 返回該對象的字符串表示,非常重要的方法 * getClass().getName();獲取字節碼文件的對應全路徑名例如java.lang.Object * Integer.toHexString(hashCode());將哈希值轉成16進制數格式的字符串。 */ public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } /** * 在使用的時候要求在synchronize語句中使用 * 喚醒在該對象的監視器上等待的單個線程 */ public final native void notify(); /** * 在使用的時候要求在synchronize語句中使用 * 喚醒在該對象的監視器上等待的所有線程 */ public final native void notifyAll(); /** * 在使用的時候要求在synchronize語句中使用 * 在其他線程調用此對象的notify()方法或notifyAll()方法前,導致當前線程等待。 * 換句話說,此方法的行爲就好像它僅執行wait(0)調用一樣。 * 當前線程必須擁有此對象監視器。該線程發佈對此監視器的所有權並等待, * 直到其他線程通過調用notify方法或notifyAll方法通知在此對象的監視器上等待的線程醒來, * 然後該線程將等到重新獲得對監視器的所有權後才能繼續執行。 */ public final native void wait(long timeout) throws InterruptedException; /** * 在使用的時候要求在synchronize語句中使用 * 讓當前線程等待直到另一個線程調用了此對象的notify()或notifyAll()方法, * 或者其他某個線程中斷了當前線程,或者過去了一定的時間 * nanos不能大於等於1000000ms也就是1000s */ 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); } /** * 在使用的時候要求在synchronize語句中使用 * 在其他線程調用此對象的notify()方法或notifyAll()方法前,導致當前線程等待。 * 換句話說,此方法的行爲就好像它僅執行wait(0)調用一樣。 * 當前線程必須擁有此對象監視器。該線程發佈對此監視器的所有權並等待, * 直到其他線程通過調用notify方法或notifyAll方法通知在此對象的監視器上等待的線程醒來, * 然後該線程將等到重新獲得對監視器的所有權後才能繼續執行。 */ public final void wait() throws InterruptedException { wait(0); } /** * 當垃圾回收器確定該對象沒有被引用時,調用此方法 */ protected void finalize() throws Throwable { } }
JDK源碼之Object類詳解(一)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.