1 package java.lang; 2 3 4 public class Object { 5 6 /** 7 * 一個本地方法,具體是用C(C++)在DLL中實現的,而後經過JNI調用 8 */ 9 private static native void registerNatives(); 10 11 /** 12 * 對象初始化時自動調用此方法 13 */ 14 static { 15 registerNatives(); 16 } 17 18 /** 19 * 返回此Object的運行時類 20 */ 21 public final native Class<?> getClass(); 22 23 /** 24 * hashCode的常規協定是: 25 * 1.在java應用程序執行期間,在對同一對象屢次調用hashCode()方法時,必須一致地返回相同的整數,前提是將對象進行equals比較時所用的信息沒有被修改。 26 * 從某一應用程序的一次執行到同一應用程序的另外一次執行,該整數無需保持一致。 27 * 2.若是根據equals(object)方法,兩個對象是相等的,那麼對這兩個對象中的每一個對象調用hashCode方法都必須生成相同的整數結果。 28 * 3.若是根據equals(java.lang.Object)方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用hashCode()方法不要求必定生成不一樣的整數結果。 29 * 可是,程序員應該意識到,爲不相等的對象生成不一樣整數結果能夠提升哈希表的性能。 30 */ 31 public native int hashCode(); 32 33 /** 34 * 這裏比較的是對象的內存地址 35 */ 36 public boolean equals(Object obj) { 37 return (this == obj); 38 } 39 40 /** 41 * 本地clone方法,用於對象的複製 42 */ 43 protected native Object clone() throws CloneNotSupportedException; 44 45 /** 46 * 返回該對象的字符串表示,很是重要的方法 47 * getClass().getName();獲取字節碼文件的對應全路徑名例如java.lang.Object 48 * Integer.toHexString(hashCode());將哈希值轉成16進制數格式的字符串。 49 */ 50 public String toString() { 51 return getClass().getName() + "@" + Integer.toHexString(hashCode()); 52 } 53 54 /** 55 * 不能被重寫,用於喚醒一個在因等待該對象(調用了wait方法)被處於等待狀態(waiting 或 time_wait)的線程,該方法只能同步方法或同步塊中調用 56 */ 57 public final native void notify(); 58 59 /** 60 * 不能被重寫,用於喚醒全部在因等待該對象(調用wait方法)被處於等待狀態(waiting或time_waiting)的線程,該方法只能同步方法或同步塊中調用 61 */ 62 public final native void notifyAll(); 63 64 /** 65 * 不能被重寫,用於在線程調用中,致使當前線程進入等待狀態(time_waiting),timeout單位爲毫秒,該方法只能同步方法或同步塊中調用,超過設置時間後線程從新進入可運行狀態 66 */ 67 public final native void wait(long timeout) throws InterruptedException; 68 69 70 public final void wait(long timeout, int nanos) throws InterruptedException { 71 if (timeout < 0) { 72 throw new IllegalArgumentException("timeout value is negative"); 73 } 74 75 if (nanos < 0 || nanos > 999999) { 76 throw new IllegalArgumentException( 77 "nanosecond timeout value out of range"); 78 } 79 80 if (nanos > 0) { 81 timeout++; 82 } 83 84 wait(timeout); 85 } 86 87 /** 88 * 在其餘線程調用此對象的notify()方法或notifyAll()方法前,致使當前線程等待。換句話說,此方法的行爲就好像它僅執行wait(0)調用同樣。 89 * 當前線程必須擁有此對象監視器。 90 * 該線程發佈對此監視器的全部權並等待,直到其餘線程經過調用notify方法或notifyAll方法通知在此對象的監視器上等待的線程醒來, 91 * 而後該線程將等到從新得到對監視器的全部權後才能繼續執行。 92 */ 93 public final void wait() throws InterruptedException { 94 wait(0); 95 } 96 97 /** 98 * 這個方法用於當對象被回收時調用,這個由JVM支持,Object的finalize方法默認是什麼都沒有作,若是子類須要在對象被回收時執行一些邏輯處理,則能夠重寫finalize方法。 99 */ 100 protected void finalize() throws Throwable { 101 } 102 }