1. 程式人生 > >Object源碼解析(JDK1.8)

Object源碼解析(JDK1.8)

程序 導致 字符串表 out 狀態 als code sta c++

  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 }

Object源碼解析(JDK1.8)