鴻蒙OS Object

2022-05-17 17:49 更新

Object

java.lang.Object

public class Object

Class Object 是類層次的根。 每個類都有 Object 作為超類。 所有對象,包括數(shù)組,都實現(xiàn)了這個類的方法。

構造函數(shù)摘要

構造函數(shù) 描述
Object()

方法總結

修飾符和類型 方法 描述
protected Object clone() 創(chuàng)建并返回此對象的副本。
boolean equals(Object obj) 指示其他對象是否“等于”這個對象。
protected void finalize() 當垃圾收集確定不再有對該對象的引用時,由對象上的垃圾收集器調用。
Class<?> getClass() 返回此 Object 的運行時類。
int hashCode() 返回對象的哈希碼值。
void notify() 喚醒正在此對象的監(jiān)視器上等待的單個線程。
void notifyAll() 喚醒正在此對象的監(jiān)視器上等待的所有線程。
String toString() 返回對象的字符串表示形式。
void wait() 使當前線程等待,直到另一個線程為此對象調用 notify() 方法或 notifyAll() 方法。
void wait(long timeout) 使當前線程等待,直到另一個線程為此對象調用 notify() 方法或 notifyAll() 方法,或者經(jīng)過了指定的時間量。
void wait(long timeout, int nanos) 導致當前線程等待,直到另一個線程為此對象調用 notify() 方法或 notifyAll() 方法,或者某個其他線程中斷當前線程,或者已經(jīng)過了一定的實時時間。

構造函數(shù)詳細信息

Object

public Object()

方法詳情

getClass

public final Class<?> getClass()

返回此 Object 的運行時類。 返回的 Class 對象是被表示類的靜態(tài)同步方法鎖定的對象。

實際結果類型是Class<? 擴展 |X|> 其中 |X| 是調用 getClass 的表達式的靜態(tài)類型的擦除。 例如,在此代碼片段中不需要強制轉換:

Number n = 0; Class<? extends Number> c = n.getClass();

返回:

表示此對象的運行時類的 Class 對象。

hashCode

public int hashCode()

返回對象的哈希碼值。支持這種方法是為了有利于哈希表,例如 HashMap 提供的那些。

hashCode 的一般合約是:

  • 每當在 Java 應用程序執(zhí)行期間對同一對象多次調用時,hashCode 方法必須始終返回相同的整數(shù),前提是沒有修改對象上相等比較中使用的信息。該整數(shù)不需要從應用程序的一次執(zhí)行到同一應用程序的另一次執(zhí)行保持一致。
  • 如果兩個對象根據(jù) equals(Object) 方法相等,則對兩個對象中的每一個調用 hashCode 方法必須產(chǎn)生相同的整數(shù)結果。
  • 如果根據(jù) equals(java.lang.Object) 方法,如果兩個對象不相等,則不要求對兩個對象中的每一個調用 hashCode 方法必須產(chǎn)生不同的整數(shù)結果。但是,程序員應該意識到,為不相等的對象生成不同的整數(shù)結果可能會提高哈希表的性能。

在合理可行的情況下,由 Object 類定義的 hashCode 方法確實為不同的對象返回不同的整數(shù)。 (這通常通過將對象的內(nèi)部地址轉換為整數(shù)來實現(xiàn),但 Java? 編程語言不需要這種實現(xiàn)技術。)

返回:

此對象的哈希碼值。

equals

public boolean equals(Object obj)

指示其他對象是否“等于”這個對象。

equals 方法在非空對象引用上實現(xiàn)等價關系:

  • 它是 reflexive:對于任何非空引用值 x,x.equals(x) 應該返回 true。
  • 它是對稱的:對于任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應該返回 true。
  • 傳遞:對于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true 并且 y.equals(z) 返回 true,則 x.equals(z) 應該返回 true .
  • 它是一致的:對于任何非空引用值 x 和 y,x.equals(y) 的多次調用始終返回 true 或始終返回 false,前提是沒有修改對象上 equals 比較中使用的信息。
  • 對于任何非空引用值 x,x.equals(null) 應該返回 false。

Object 類的 equals 方法實現(xiàn)了對象上最有區(qū)別的可能等價關系;也就是說,對于任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象(x == y 的值為 true)時,此方法才返回 true。

請注意,每當重寫該方法時,通常都需要重寫 hashCode 方法,以維護 hashCode 方法的一般約定,即相等的對象必須具有相等的哈希碼。

參數(shù):

參數(shù)名稱 參數(shù)描述
obj 要與之比較的參考對象。

返回:

如果此對象與 obj 參數(shù)相同,則為 true; 否則為假。

clone

protected Object clone() throws CloneNotSupportedException

創(chuàng)建并返回此對象的副本。 “復制”的確切含義可能取決于對象的類別。 一般意圖是,對于任何對象 x,表達式:

 x.clone() != x

將會為true,并且表達式:

 x.clone().getClass() == x.getClass()

將會為true,但這些不是絕對的要求。 雖然通常是這樣的:

 x.clone().equals(x)

會是真的,這不是一個絕對的要求。

按照約定,返回的對象應該通過調用 super.clone 來獲取。如果一個類及其所有超類(Object 除外)都遵守這個約定,那么 x.clone().getClass() == x.getClass() 就是這種情況。

按照慣例,此方法返回的對象應獨立于此對象(正在克?。榱藢崿F(xiàn)這種獨立性,可能需要在返回 super.clone 之前修改對象的一個或多個字段。通常,這意味著復制任何包含被克隆對象的內(nèi)部“深層結構”的可變對象,并將對這些對象的引用替換為對副本的引用。如果一個類只包含原始字段或對不可變對象的引用,那么通常情況下 super.clone 返回的對象中不需要修改任何字段。

類 Object 的方法 clone 執(zhí)行特定的克隆操作。首先,如果該對象的類沒有實現(xiàn)接口 Cloneable,則拋出 CloneNotSupportedException。請注意,所有數(shù)組都被認為實現(xiàn)了接口 Cloneable,并且數(shù)組類型 T[] 的克隆方法的返回類型是 T[],其中 T 是任何引用或原始類型。否則,此方法會創(chuàng)建此對象的類的新實例,并使用此對象的相應字段的內(nèi)容來初始化其所有字段,就像通過賦值一樣;字段的內(nèi)容本身不會被克隆。因此,此方法執(zhí)行此對象的“淺拷貝”,而不是“深拷貝”操作。

Object 類本身并沒有實現(xiàn)接口 Cloneable,因此在類為 Object 的對象上調用 clone 方法將導致在運行時拋出異常。

返回:

此實例的克隆。

Throws:

Throw名稱 Throw描述
CloneNotSupportedException 如果對象的類不支持 Cloneable 接口。 覆蓋 clone 方法的子類也可以拋出此異常,表示無法克隆實例。

toString

public String toString()

返回對象的字符串表示形式。 通常,toString 方法返回一個“以文本方式表示”該對象的字符串。 結果應該是一個簡潔但信息豐富的表示,易于人們閱讀。 建議所有子類重寫此方法。

Object 類的 toString 方法返回一個字符串,該字符串由對象作為其實例的類的名稱、at 符號字符“@”和對象哈希碼的無符號十六進制表示形式組成。 換句話說,此方法返回一個等于以下值的字符串:

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

返回:

對象的字符串表示形式。

notify

public final void notify()

喚醒正在此對象的監(jiān)視器上等待的單個線程。如果有任何線程正在等待該對象,則選擇其中一個被喚醒。該選擇是任意的,并由實施自行決定。線程通過調用其中一個等待方法在對象的監(jiān)視器上等待。

在當前線程放棄對該對象的鎖定之前,被喚醒的線程將無法繼續(xù)。被喚醒的線程將以通常的方式與可能正在積極競爭以在此對象上同步的任何其他線程競爭;例如,被喚醒的線程在成為下一個鎖定該對象的線程時不享有可靠的特權或劣勢。

此方法只能由作為該對象監(jiān)視器所有者的線程調用。線程通過以下三種方式之一成為對象監(jiān)視器的所有者:

  • 通過執(zhí)行該對象的同步實例方法。
  • 通過執(zhí)行在對象上同步的同步語句的主體。
  • 對于 Class 類型的對象,通過執(zhí)行該類的同步靜態(tài)方法。

一次只有一個線程可以擁有一個對象的監(jiān)視器。

Throws:

Throw名稱 Throw描述
IllegalMonitorStateException 如果當前線程不是該對象監(jiān)視器的所有者。

notifyAll

public final void notifyAll()

喚醒正在此對象的監(jiān)視器上等待的所有線程。 線程通過調用其中一個等待方法在對象的監(jiān)視器上等待。

在當前線程放棄對該對象的鎖定之前,被喚醒的線程將無法繼續(xù)。 被喚醒的線程將以通常的方式與可能正在積極競爭以在該對象上同步的任何其他線程競爭; 例如,被喚醒的線程在成為下一個鎖定該對象的線程時不享有可靠的特權或劣勢。

此方法只能由作為該對象監(jiān)視器所有者的線程調用。

Throws:

Throw名稱 Throw描述
IllegalMonitorStateException 如果當前線程不是該對象監(jiān)視器的所有者。

wait

public final void wait(long timeout) throws InterruptedException

使當前線程等待,直到另一個線程為此對象調用 notify() 方法或 notifyAll() 方法,或者經(jīng)過了指定的時間量。

當前線程必須擁有該對象的監(jiān)視器。

此方法使當前線程(稱為 T)將自己置于該對象的等待集中,然后放棄對該對象的所有同步聲明。線程 T 出于線程調度目的而被禁用并處于休眠狀態(tài),直到發(fā)生以下四種情況之一:

  • 某個其他線程調用了該對象的 notify 方法,而線程 T 恰好被任意選擇為要被喚醒的線程。
  • 其他一些線程為此對象調用 notifyAll 方法。
  • 其他一些線程 Thread#interrupt() 線程 T。
  • 或多或少已經(jīng)過了指定的實時時間。但是,如果超時為零,則不考慮實時時間,線程只是等待直到收到通知。

然后將線程 T 從該對象的等待集中移除,并重新啟用線程調度。然后它以通常的方式與其他線程競爭對象同步的權利;一旦它獲得了對象的控制權,它對對象的所有同步聲明都會恢復到之前的狀態(tài)——即,恢復到調用等待方法時的狀態(tài)。線程 T 然后從調用等待方法返回。因此,從等待方法返回時,對象和線程 T 的同步狀態(tài)與調用等待方法時完全相同。

線程也可以在沒有被通知、中斷或超時的情況下喚醒,即所謂的虛假喚醒。雖然這在實踐中很少發(fā)生,但應用程序必須通過測試應該導致線程被喚醒的條件來防范它,如果條件不滿足則繼續(xù)等待。換句話說,等待應該總是在循環(huán)中發(fā)生,就像這樣:

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

(有關此主題的更多信息,請參閱 Doug Lea 的“Java 中的并發(fā)編程(第二版)”(Addison-Wesley,2000)中的第 3.2.3 節(jié),或 Joshua Bloch 的“有效的 Java 編程語言指南”(Addison- 韋斯利,2001)。

如果當前線程在等待之前或期間被任何線程中斷,則拋出 InterruptedException。 在此對象的鎖定狀態(tài)已按上述恢復之前,不會引發(fā)此異常。

請注意,wait 方法將當前線程放入該對象的等待集中,僅解鎖該對象; 當前線程可能同步的任何其他對象在線程等待時保持鎖定。

此方法只能由作為該對象監(jiān)視器所有者的線程調用。 有關線程可以成為監(jiān)視器所有者的方式的描述,請參見 notify 方法。

參數(shù):

參數(shù)名稱 參數(shù)描述
timeout 等待的最長時間(以毫秒為單位)。

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果 timeout 的值為負。
IllegalMonitorStateException 如果當前線程不是對象監(jiān)視器的所有者。
InterruptedException 如果任何線程在當前線程等待通知之前或期間中斷了當前線程。 拋出此異常時清除當前線程的中斷狀態(tài)。

wait

public final void wait(long timeout, int nanos) throws InterruptedException

導致當前線程等待,直到另一個線程為此對象調用 notify() 方法或 notifyAll() 方法,或者某個其他線程中斷當前線程,或者已經(jīng)過了一定的實時時間。

此方法類似于一個參數(shù)的等待方法,但它允許更好地控制在放棄之前等待通知的時間量。 以納秒為單位測量的實時量由下式給出:

 1000000*timeout+nanos

在所有其他方面,此方法與一個參數(shù)的方法 wait(long) 執(zhí)行相同的操作。 特別是,wait(0, 0) 與 wait(0) 的含義相同。

當前線程必須擁有該對象的監(jiān)視器。 線程釋放此監(jiān)視器的所有權并等待,直到發(fā)生以下兩種情況之一:

  • 另一個線程通過調用 notify 方法或 notifyAll 方法通知在此對象的監(jiān)視器上等待喚醒的線程。
  • 超時時間(由 timeout 毫秒加上 nanos 納秒?yún)?shù)指定)已經(jīng)過去。

然后線程等待直到它可以重新獲得監(jiān)視器的所有權并恢復執(zhí)行。

與單參數(shù)版本一樣,中斷和虛假喚醒是可能的,并且應該始終在循環(huán)中使用此方法:

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

此方法只能由作為該對象監(jiān)視器所有者的線程調用。

參數(shù):

參數(shù)名稱 參數(shù)描述
timeout 等待的最長時間(以毫秒為單位)。
nanos 附加時間,以納秒為單位,范圍 0-999999。

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果 timeout 的值為負或 nanos 的值不在 0-999999 范圍內(nèi)。
IllegalMonitorStateException 如果當前線程不是該對象監(jiān)視器的所有者。
InterruptedException 如果任何線程在當前線程等待通知之前或期間中斷了當前線程。 拋出此異常時清除當前線程的中斷狀態(tài)。

wait

public final void wait() throws InterruptedException

使當前線程等待,直到另一個線程為此對象調用 notify() 方法或 notifyAll() 方法。 換句話說,此方法的行為與它只是執(zhí)行調用 wait(0) 完全相同。

當前線程必須擁有該對象的監(jiān)視器。 線程釋放此監(jiān)視器的所有權并等待,直到另一個線程通過調用 notify 方法或 notifyAll 方法通知在此對象的監(jiān)視器上等待的線程喚醒。 然后線程等待直到它可以重新獲得監(jiān)視器的所有權并恢復執(zhí)行。

與單參數(shù)版本一樣,中斷和虛假喚醒是可能的,并且應該始終在循環(huán)中使用此方法:

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

此方法只能由作為該對象監(jiān)視器所有者的線程調用。

Throws:

Throw名稱 Throw描述
IllegalMonitorStateException 如果當前線程不是對象監(jiān)視器的所有者。
InterruptedException 如果任何線程在當前線程等待通知之前或期間中斷了當前線程。 拋出此異常時清除當前線程的中斷狀態(tài)。

finalize

protected void finalize() throws Throwable

當垃圾收集確定不再有對該對象的引用時,由對象上的垃圾收集器調用。子類覆蓋 finalize 方法以釋放系統(tǒng)資源或執(zhí)行其他清理。

finalize 的一般約定是,當 Java? 虛擬機確定不再有任何方法可以讓任何尚未終止的線程訪問此對象時調用它,除非是由于某個操作由準備完成的其他對象或類的完成所采取。 finalize 方法可以采取任何行動,包括使該對象再次可供其他線程使用;然而,finalize 的通常目的是在對象被不可撤銷地丟棄之前執(zhí)行清理操作。例如,代表輸入/輸出連接的對象的 finalize 方法可能會執(zhí)行顯式 I/O 事務以在對象被永久丟棄之前中斷連接。

Object 類的 finalize 方法不執(zhí)行任何特殊操作;它只是正常返回。 Object 的子類可以覆蓋這個定義。

Java 編程語言不保證哪個線程將為任何給定對象調用 finalize 方法。但是,可以保證調用 finalize 的線程在調用 finalize 時不會持有任何用戶可見的同步鎖。如果 finalize 方法拋出未捕獲的異常,則忽略該異常并終止該對象的終結。

在為一個對象調用 finalize 方法之后,不會采取進一步的行動,直到 Java 虛擬機再次確定沒有任何方法可以讓任何尚未終止的線程訪問該對象,包括可能的行動由其他準備完成的對象或類,此時該對象可能被丟棄。

對于任何給定的對象,Java 虛擬機永遠不會多次調用 finalize 方法。

finalize 方法拋出的任何異常都會導致該對象的終結被暫停,否則會被忽略。

Throws:

Throw名稱 Throw描述
Throwable 此方法引發(fā)的異常
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號