[java][源碼]java.lang.Object

1、基準jdk版本

jdk版本 JDK1.8

2、方法列表

java.lang.Object

序號 方法名 描述
1 Object 默認構造器
2 registerNatives 註冊本地庫
3 getClass 獲取對象的運行時類
4 hashCode 獲取對象的哈希碼值
5 equals 比較是否相等
6 clone 複製對象
7 toString 返回對象的字符串表示形式
8 notify 喚醒等待此對象監視器的單個線程
9 notifyAll 喚醒此對象監視器上等待的所有線程
10 wait(long timeout) 使當前線程等待
11 wait(long timeout, int nanos) 使當前線程等待
12 wait 使當前線程等待
13 finalize 釋放系統資源或執行其他清理

3、方法詳細描述

3.1 Object

  構造器函數。一個類必須要有一個構造器的存在,如果沒有顯示聲明,那麼系統會默認創造一個無參構造器。

3.2 registerNatives

  該方法使用native來修飾,用native聲明的方法表示告知JVM使用JNI技術調用C代碼。該方法使用了靜態代碼塊,就是一個類在初始化過程中必定會執行的內容,所以在類加載的時候是會執行該方法的,通過該方法來註冊本地方法。

3.3 getClass

  該方法的作用是返回一個對象的運行時類,通過這個類對象我們可以獲取該運行時類的相關屬性和方法。

3.4 hashCode

  獲取對象的哈希碼值。 這個方法是爲了支持散列表,例如: {@link java.util.HashMap}。

  • 當Java應用程序執行期間對同一對象多次調用{@code hashCode}方法時,只要對象的{@code equals}比較中使用的信息沒有被修改,則該方法必須返回相同的整數。
  • 同一應用程序的多次啓動執行,此整數不必保持一致。
  • 如果調用{@code equals(Object)}方法,兩個對象相等,那麼這兩個對象中的每個對象調用{@code hashCode}方法必須產生相同的整數。
  • 調用{@link java.lang.Object#equals(java.lang.Object)}方法,如果兩個對象不相等,則這兩個對象中的每個對象調用{@code hashCode}方法必須產生不同的整數結果。但程序員知道不相等的對象生成不同的整數可能會提高哈希表的性能。
  • hashCode方法確實爲不同的對象返回不同的整數,通常是通過將對象的內部地址轉換爲整數來實現的,但是Java編程語言不需要這種實現技術。

3.5 equals

  指示其他對象是否“等於”此對象。
  {@code equals}方法是爲非空對象引用上實現等價關係:

  • 自反性:對於任何非空引用值{@code x}, {@code x.equals(x)}應該返回{@code true}。
  • 對稱性:對於任何非空的引用值{@code x}和{@code y},{@code x.equals(y)}和{@code y.equals(x)}都返回{@code true}。
  • 傳遞性:對於任何非空的引用值{@code x}、{@code y}和{@code z},如果{@code x.equals(y)}返回{@code true},{@code y.equals(z)}返回{@code true},則{@code x.equals(z)}應返回{@code true}。
  • 一致性:如果對象在比較中信息沒有被修改,那麼對於任何非空的引用值{@code x}和{@code y},多次調用{@code x.equals(y)},返回一致的{@code true}或返回一致的{@code false}。
  • 對於任何非空引用值{@code x},{@code x.equals(null)}應返回{@code false}。

  注意,當重寫此方法時,需要重寫{@code hashCode}方法,以便維護{@code hashCode}方法的一般約定,該約定聲明相等的對象必須具有相等的hash code。

3.6 clone

  創建並返回此對象的副本。“複製”的確切含義依賴於對象的類型。
一般來說,對於任何對象{@code x},表達式x.clone() != x返回{@code true},則x.clone().getClass() == x.getClass()將爲{@code true},但這些不是絕對的要求。
按照約定,返回的對象應該通過調用{@code super.clone}獲得。如果一個類及其所有超類(除了{@code Object})都遵守此約定,那麼{@code x.clone().getClass() == x.getClass()}返回{@code true}。

  按照慣例,此方法返回的正在克隆的對象應獨立於此對象。爲了實現獨立,在返回前,可能需要修改{@code super.clone}返回的對象的一個或多個字段;通常,用副本的引用替換被克隆對象的內部的任何可變對象的引用;如果一個類只包含原始類型或對不可變對象的引用,那麼通常情況下{@code super.clone}返回的對象中不需要修改任何字段。

  注意:

  • 如果這個對象的類沒有實現接口{@code Cloneable},那麼會拋出{@code CloneNotSupportedException}。
  • 所有數組都實現了接口{@code Cloneable},所以數組類型調用{@code clone}方法返回{@code T[]},其中T是任何引用或原始類型。
  • 其他情況下,此方法將創建此對象的類的新實例,並使用此對象相應字段的內容初始化其所有字段,就像通過賦值一樣,字段的內容本身並不是克隆的。因此,此方法執行此對象的“淺複製”,而不是“深複製”操作。
  • 類{@code Object}本身並不實現接口{@code Cloneable},因此對類爲{@code Object}的對象調用{@code clone}方法將導致在運行時異常。

3.7 toString

  返回對象的字符串表示形式。
  通常,{@code toString}方法返回一個字符串,該字符串“以文本形式表示”該對象。結果應該是一個簡潔但信息量大的表述,便於閱讀。建議所有子類重寫此方法。
  類{@code Object}的{@code toString}方法返回一個字符串,該字符串由對象是其實例的類的名稱、at符號字符{@code@}和對象哈希代碼的無符號十六進制表示組成。
  換句話說,此方法返回的字符串等於:

getClass().getName() + '@' + Integer.toHexString(hashCode())

3.8 notify

  喚醒等待此對象監視器的單個線程。
  如果有任何線程正在等待這個對象,則選擇其中一個線程被喚醒。選擇是任意的,由實現者自行決定。線程通過調用{@code wait}方法之一來等待對象的監視器。
  在當前線程放棄對該對象的鎖定之前,喚醒的線程將無法繼續。喚醒的線程將與任何其他線程競爭,這些線程可能正在積極競爭在此對象上同步;所以,喚醒的線程在成爲下一個鎖定此對象的線程時沒有可靠的特權或劣勢。
此方法只能由作爲此對象監視器所有者的線程調用。線程通過以下三種方式之一成爲對象監視器的所有者:

  • 通過執行該對象的同步實例方法。
  • 通過執行在對象上{@code synchronized}標識的同步語句主體。
  • 對於{@code Class,}類型的對象,執行該類的同步靜態方法。

  一次只能有一個線程擁有對象的監視器。

3.9 notifyAll
  喚醒此對象監視器上等待的所有線程。
  線程通過調用{@code wait}方法之一來等待對象的監視器。在當前線程放棄對該對象的鎖定之前,喚醒的線程將無法繼續。喚醒的線程將與任何其他線程競爭,這些線程可能正在積極競爭在此對象上同步,所以,喚醒的線程在成爲下一個鎖定此對象的線程時沒有可靠的特權或劣勢。
  此方法只能由作爲此對象監視器所有者的線程調用。請參閱{@code notify}方法,以瞭解線程成爲監視器所有者的方式。

3.10 wait(long timeout)

  使當前線程等待,直到另一個線程調用此對象的{@link java.lang.Object#notify()}方法或{@link java.lang.Object#notifyAll()}方法,或者指定的時間已過。
  當前線程必須擁有此對象的監視器。
  此方法會導致當前線程(T)將自身放置在此對象的等待集合中,然後放棄對此對象的任何和所有同步聲明。出於線程調度的目的,線程T將被禁用,並處於休眠狀態,直到發生以下四種情況之一:

  • 其他一些線程爲此對象調用{@code notify}方法,線程T碰巧被任意選擇爲要喚醒的線程;
  • 其他一些線程爲此對象調用{@code notifyAll}方法;
  • 其他一些線程{@linkplain thread#interrupt()}中斷線程T;
  • 指定的超時時間已經超時。但是,如果{@code timeout}爲零,則不考慮超時,線程只需等待通知。

  然後從該對象的等待集合中刪除線程T,並重新啓用線程調度。然後,它與其他線程競爭對象上的同步權;一旦它獲得了對象的控制權,它對對象的所有同步聲明都將恢復到原來的狀態,也就是說,恢復到調用{@code wait}方法時的狀態,然後線程T從{@code wait}方法的調用返回。因此,從{@code wait}方法返回時,對象和線程{@code T}的同步狀態與調用{@code wait}方法時完全相同。

  線程也可以在不被通知、中斷或超時的情況下喚醒,即所謂的虛假喚醒。雖然這種情況在實踐中很少發生,但應用程序必須通過測試本應導致線程被喚醒的條件,並在條件不滿足時繼續等待來防範這種情況。換句話說,等待應該總是以循環的形式出現,就像這樣:

 synchronized (obj) {
              while (<condition does not hold>)
                  obj.wait(timeout);
              ... // Perform action appropriate to condition
          }

  (有關此主題的更多信息,請參閱Doug Lea的“Java併發編程(第二版)”(Addison-Wesley,2000)中的第3.2.3節,或Joshua Bloch的“有效Java編程語言指南”(Addison-Wesley,2001)中的第50項)。
  如果當前線程在等待之前或等待期間被任何線程{@linkplain java.lang.thread#interrupt()}中斷,則拋出{@code InterruptedException}。在還原此對象的鎖定狀態之前,不會引發此異常。
  注意,{@code wait}方法在將當前線程放入此對象的等待集合中時,只解鎖此對象;在線程等待期間,當前線程可能同步的任何其他對象都將保持鎖定狀態。
  此方法只能由作爲此對象監視器所有者的線程調用。請參閱{@code notify}方法,以瞭解線程成爲監視器所有者的方式。

3.11 wait(long timeout, int nanos)

  使當前線程等待,直到另一個線程調用此對象的{@link java.lang.Object#notify()}方法或{@link java.lang.Object#notifyAll()}方法,或者指定的時間已過。
  此方法類似於一個參數的{@code wait}方法,但它允許更好地控制在放棄之前等待通知的時間量。實時量(以納秒爲單位)由下式給出:1000000*timeout+nanos。
  在所有其他方面,此方法的作用與一個參數的方法{@link#wait(long)}相同。尤其是,{@code wait(0,0)}與{@code wait(0)}的意思相同。
當前線程必須擁有此對象的監視器。線程釋放此監視器的所有權,並等待發生以下兩種情況之一:

  • 另一個線程通過調用{@code notify}方法或{@code notifyAll}方法通知等待此對象監視器喚醒的線程。
  • 由{@code timeout}毫秒加上{@code nanos}納秒參數指定的超時時間已過。
    然後線程等待,直到它可以重新獲得監視器的所有權並繼續執行。
    在一個參數的版本中,中斷和虛假喚醒是可能的,這個方法應該在循環中使用:
synchronized (obj) {
              while (<condition does not hold>)
                  obj.wait(timeout, nanos);
             ... // Perform action appropriate to condition
         }

  此方法只能由作爲此對象監視器所有者的線程調用。請參閱{@code notify}方法,以瞭解線程成爲監視器所有者的方式。

3.12 wait

  使當前線程等待,直到另一個線程調用此對象的{@link java.lang.Object#notify()}方法或{@link java.lang.Object#notifyAll()}方法。換句話說,此方法的行爲與執行調用{@code wait(0)}完全相同。
  當前線程必須擁有此對象的監視器。線程釋放此監視器的所有權並等待,直到另一個線程通過調用{@code notify}方法或{@code notifyAll}方法通知等待此對象監視器喚醒的線程。然後線程等待,直到它可以重新獲得監視器的所有權並繼續執行。
  在一個參數的版本中,中斷和虛假喚醒是可能的,這個方法應該在循環中使用:

synchronized (obj) {
              while (<condition does not hold>)
                  obj.wait(timeout, nanos);
             ... // Perform action appropriate to condition
         }

  此方法只能由作爲此對象監視器所有者的線程調用。請參閱{@code notify}方法,以瞭解線程成爲監視器所有者的方式。

3.13 finalize

  當垃圾回收確定不再存在對對象的引用時,垃圾回收器對對象調用。子類重寫{@code finalize}方法以釋放系統資源或執行其他清理。
   如果是Java&trade,一般約定是調用{@code finalize};虛擬機已確定不再有任何方法可以讓任何尚未終止的線程訪問此對象,除非是由於某個其他對象或類的終結所採取的操作,該操作已準備好進行終結。{@code finalize}方法可以執行任何操作,包括使此對象對其他線程再次可用;但是,{@code finalize}的通常目的是在對象被不可撤銷地丟棄之前執行清理操作。例如,表示輸入/輸出連接的對象的finalize方法可能會執行顯式I/O事務,以便在永久丟棄該對象之前斷開連接。
類{@code Object}的{@code finalize}方法不執行特殊操作;它只是正常返回。{@code Object}的子類可以重寫此定義。
   Java編程語言不保證哪個線程將爲任何給定對象調用{@code finalize}方法。但是,可以保證調用finalize的線程在調用finalize時不會持有任何用戶可見的同步鎖。如果finalize方法引發未捕獲的異常,則將忽略該異常,並終止該對象的finalize。
   在爲一個對象調用{@code finalize}方法之後,直到Java虛擬機再次確定不再有任何方法可以讓任何尚未終止的線程訪問該對象,包括其他已準備好完成的對象或類的可能操作,才採取進一步的操作,此時對象可能會被丟棄。
   對於任何給定的對象,{@code finalize}方法都不會被Java虛擬機多次調用。
   {@code finalize}方法引發的任何異常都會導致此對象的終止,否則將被忽略。

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