JavaTM 2 Platform
Standard Ed. 6

java.lang
類別 Object

java.lang.Object

public class Object

類別 Object 是類別層次結構的根類別。每個類別都使用 Object 作為父級類別。所有物件(包括陣列)都實作這個類別的方法。

從以下版本開始:
JDK1.0
另請參見:
Class

建構子摘要
Object()
           
 
方法摘要
protected  Object clone()
          創建並返回此物件的一個副本。
 boolean equals(Object obj)
          指示其他某個物件是否與此物件「相等」。
protected  void finalize()
          當垃圾回收器確定不存在對該物件的更多參考時,由物件的垃圾回收器調用此方法。
 Class<?> getClass()
          返回此 Object 的運行時類別。
 int hashCode()
          返回該物件的雜湊碼值。
 void notify()
          喚醒在此物件監視器上等待的單個執行緒。
 void notifyAll()
          喚醒在此物件監視器上等待的所有執行緒。
 String toString()
          返回該物件的字元串表示。
 void wait()
          在其他執行緒調用此物件的 notify() 方法或 notifyAll() 方法前,導致當前執行緒等待。
 void wait(long timeout)
          在其他執行緒調用此物件的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,導致當前執行緒等待。
 void wait(long timeout, int nanos)
          在其他執行緒調用此物件的 notify() 方法或 notifyAll() 方法,或者其他某個執行緒中斷當前執行緒,或者已超過某個實際時間量前,導致當前執行緒等待。
 

建構子詳細資訊

Object

public Object()
方法詳細資訊

getClass

public final Class<?> getClass()
返回此 Object 的運行時類別。返回的 Class 物件是由所表示類別的 static synchronized 方法鎖定的物件。

實際結果型別是 Class<? extends |X|>,其中 |X| 表示清除表達式中的靜態型別,該表達式調用 getClass 例如,以下程式碼片段中不需要強制轉換:

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

返回:
表示此物件運行時類別的 Class 物件。
另請參見:
The Java Language Specification, Third Edition (15.8.2 Class Literals)

hashCode

public int hashCode()
返回該物件的雜湊碼值。支持此方法是為了提高雜湊表(例如 java.util.Hashtable 提供的雜湊表)的性能。

hashCode 的常規協定是:

實際上,由 Object 類別定義的 hashCode 方法確實會針對不同的物件返回不同的整數。(這一般是通過將該物件的內部位址轉換成一個整數來實作的,但是 JavaTM 程式語言不需要這種實作技巧。)

返回:
此物件的一個雜湊碼值。
另請參見:
equals(java.lang.Object), Hashtable

equals

public boolean equals(Object obj)
指示其他某個物件是否與此物件「相等」。

equals 方法在非空(null)物件參考上實作相等關係:

Object 類別的 equals 方法實作物件上差別可能性最大的相等關係;即,對於任何非空(null)參考值 xy,當且僅當 xy 參考同一個物件時,此方法才返回 truex == y 具有值 true)。

注意:當此方法被覆寫時,通常有必要覆寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定宣告相等物件必須具有相等的雜湊碼。

參數:
obj - 要與之比較的參考物件。
返回:
如果此物件與 obj 參數相同,則返回 true;否則返回 false
另請參見:
hashCode(), Hashtable

clone

protected Object clone()
                throws CloneNotSupportedException
創建並返回此物件的一個副本。「副本」的準確含義可能依賴於物件的類別。這樣做的目的是,對於任何物件 x,表達式:
x.clone() != x
為 true,表達式:
x.clone().getClass() == x.getClass()
也為 true,但這些並非必須要滿足的要求。一般情況下:
x.clone().equals(x)
true,但這並非必須要滿足的要求。

按照慣例,返回的物件應該通過調用 super.clone 獲得。如果一個類別及其所有的父級類別(Object 除外)都遵守此約定,則 x.clone().getClass() == x.getClass()

按照慣例,此方法返回的物件應該獨立於該物件(正被複製的物件)。要獲得此獨立性,在 super.clone 返回物件之前,有必要對該物件的一個或多個欄位進行修改。這通常意味著要複製包含正在被複製物件的內部「深層結構」的所有可變物件,並使用對副本的參考替換對這些物件的參考。如果一個類別只包含基本欄位或對不變物件的參考,那麼通常不需要修改 super.clone 返回的物件中的欄位。

Object 類別的 clone 方法執行特定的複製操作。首先,如果此物件的類別不能實作介面 Cloneable,則會拋出 CloneNotSupportedException。注意,所有的陣列都被視為實作介面 Cloneable。否則,此方法會創建此物件的類別的一個新實例,並像通過分派那樣,嚴格使用此物件相應欄位的內容初始化該物件的所有欄位;這些欄位的內容沒有被自我複製。所以,此方法執行的是該物件的「淺表複製」,而不「深層複製」操作。

Object 類別本身不實作介面 Cloneable,所以在類別為 Object 的物件上調用 clone 方法將會導致在運行時拋出異常。

返回:
此實例的一個副本。
拋出:
CloneNotSupportedException - 如果物件的類別不支持 Cloneable 介面,則覆寫 clone 方法的子類別也會拋出此異常,以指示無法複製某個實例。
另請參見:
Cloneable

toString

public String toString()
返回該物件的字元串表示。通常,toString 方法會返回一個「以文本方式表示」此物件的字元串。結果應是一個簡明但易於讀懂的資訊表達式。建議所有子類別都覆寫此方法。

Object 類別的 toString 方法返回一個字元串,該字元串由類別名(物件是該類別的一個實例)、at 標記符“@”和此物件雜湊碼的無符號十六進製表示組成。換句話說,該方法返回一個字元串,它的值等於:

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

返回:
該物件的字元串表示形式。

notify

public final void notify()
喚醒在此物件監視器上等待的單個執行緒。如果所有執行緒都在此物件上等待,則會選擇喚醒其中一個執行緒。選擇是任意性的,並在對實作做出決定時發生。執行緒通過調用其中一個 wait 方法,在物件的監視器上等待。

直到當前執行緒放棄此物件上的鎖定,才能繼續執行被喚醒的執行緒。被喚醒的執行緒將以常規方式與在該物件上主動同步的其他所有執行緒進行競爭;例如,喚醒的執行緒在作為鎖定此物件的下一個執行緒方面沒有可靠的特權或劣勢。

此方法只應由作為此物件監視器的所有者的執行緒來調用。通過以下三種方法之一,執行緒可以成為此物件監視器的所有者:

一次只能有一個執行緒擁有對象的監視器。

拋出:
IllegalMonitorStateException - 如果當前執行緒不是此物件監視器的所有者。
另請參見:
notifyAll(), wait()

notifyAll

public final void notifyAll()
喚醒在此物件監視器上等待的所有執行緒。執行緒通過調用其中一個 wait 方法,在物件的監視器上等待。

直到當前執行緒放棄此物件上的鎖定,才能繼續執行被喚醒的執行緒。被喚醒的執行緒將以常規方式與在該物件上主動同步的其他所有執行緒進行競爭;例如,喚醒的執行緒在作為鎖定此物件的下一個執行緒方面沒有可靠的特權或劣勢。

此方法只應由作為此物件監視器的所有者的執行緒來調用。有關執行緒能夠成為監視器所有者的方法的描述,請參閱 notify 方法。

拋出:
IllegalMonitorStateException - 如果當前執行緒不是此物件監視器的所有者。
另請參見:
notify(), wait()

wait

public final void wait(long timeout)
                throws InterruptedException
在其他執行緒調用此物件的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,導致當前執行緒等待。

當前執行緒必須擁有此物件監視器。

此方法導致當前執行緒(稱之為 T)將其自身放置在物件的等待集中,然後放棄此物件上的所有同步要求。出於執行緒排程目的,在發生以下四種情況之一前,執行緒 T 被禁用,且處於休眠狀態:

然後,從物件的等待集中刪除執行緒 T,並重新進行執行緒排程。然後,該執行緒以常規方式與其他執行緒競爭,以獲得在該物件上同步的權利;一旦獲得對該物件的控制權,該物件上的所有其同步宣告都將被恢復到以前的狀態,這就是調用 wait 方法時的情況。然後,執行緒 Twait 方法的調用中返回。所以,從 wait 方法返回時,該物件和執行緒 T 的同步狀態與調用 wait 方法時的情況完全相同。

在沒有被通知、中斷或逾時的情況下,執行緒還可以喚醒一個所謂的虛假喚醒 (spurious wakeup)。雖然這種情況在實踐中很少發生,但是應用程序必須通過以下方式防止其發生,即對應該導致該執行緒被提醒的條件進行測試,如果不滿足該條件,則繼續等待。換句話說,等待應總是發生在循環中,如下面的範例:

synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
     }
 
(有關這一主題的更多資訊,請參閱 Doug Lea 撰寫的 Concurrent Programming in Java (Second Edition) (Addison-Wesley, 2000) 中的第 3.2.3 節或 Joshua Bloch 撰寫的 Effective Java Programming Language Guide (Addison-Wesley, 2001) 中的第 50 項。

如果當前執行緒在等待之前或在等待時被任何執行緒中斷,則會拋出 InterruptedException。在按上述形式恢復此物件的鎖定狀態時才會拋出此異常。

注意,由於 wait 方法將當前執行緒放入了物件的等待集中,所以它只能解除此物件的鎖定;可以同步當前執行緒的任何其他物件在執行緒等待時仍處於鎖定狀態。

此方法只應由作為此物件監視器的所有者的執行緒來調用。有關執行緒能夠成為監視器所有者的方法的描述,請參閱 notify 方法。

參數:
timeout - 要等待的最長時間(以毫秒為單位)。
拋出:
IllegalArgumentException - 如果逾時值為負。
IllegalMonitorStateException - 如果當前執行緒不是此物件監視器的所有者。
InterruptedException - 如果在當前執行緒等待通知之前或者正在等待通知時,任何執行緒中斷了當前執行緒。在拋出此異常時,當前執行緒的中斷狀態 被清除。
另請參見:
notify(), notifyAll()

wait

public final void wait(long timeout,
                       int nanos)
                throws InterruptedException
在其他執行緒調用此物件的 notify() 方法或 notifyAll() 方法,或者其他某個執行緒中斷當前執行緒,或者已超過某個實際時間量前,導致當前執行緒等待。

此方法類似於一個參數的 wait 方法,但它允許更好地控制在放棄之前等待通知的時間量。用毫微秒度量的實際時間量可以通過以下公式計算出來:

1000000*timeout+nanos

在其他所有方面,此方法執行的操作與帶有一個參數的 wait(long) 方法相同。需要特別指出的是,wait(0, 0)wait(0) 相同。

當前執行緒必須擁有此物件監視器。該執行緒發佈對此監視器的所有權,並等待下面兩個條件之一發生:

然後,該執行緒等到重新獲得對監視器的所有權後才能繼續執行。

對於某一個參數的版本,實作中斷和虛假喚醒是有可能的,並且此方法應始終在循環中使用:

synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout, nanos);
... // Perform action appropriate to condition
     }
 
此方法只應由作為此物件監視器的所有者的執行緒來調用。有關執行緒能夠成為監視器所有者的方法的描述,請參閱 notify 方法。

參數:
timeout - 要等待的最長時間(以毫秒為單位)。
nanos - 額外時間(以毫微秒為單位,範圍是 0-999999)。
拋出:
IllegalArgumentException - 如果逾時值是負數,或者毫微秒值不在 0-999999 範圍內。
IllegalMonitorStateException - 如果當前執行緒不是此物件監視器的所有者。
InterruptedException - 如果在當前執行緒等待通知之前或者正在等待通知時,任何執行緒中斷了當前執行緒。在拋出此異常時,當前執行緒的中斷狀態 被清除。

wait

public final void wait()
                throws InterruptedException
在其他執行緒調用此物件的 notify() 方法或 notifyAll() 方法前,導致當前執行緒等待。換句話說,此方法的行為就好像它僅執行 wait(0) 調用一樣。

當前執行緒必須擁有此物件監視器。該執行緒發佈對此監視器的所有權並等待,直到其他執行緒通過調用 notify 方法,或 notifyAll 方法通知在此物件的監視器上等待的執行緒醒來。然後該執行緒將等到重新獲得對監視器的所有權後才能繼續執行。

對於某一個參數的版本,實作中斷和虛假喚醒是可能的,而且此方法應始終在循環中使用:

synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
     }
 
此方法只應由作為此物件監視器的所有者的執行緒來調用。有關執行緒能夠成為監視器所有者的方法的描述,請參閱 notify 方法。

拋出:
IllegalMonitorStateException - 如果當前執行緒不是此物件監視器的所有者。
InterruptedException - 如果在當前執行緒等待通知之前或者正在等待通知時,任何執行緒中斷了當前執行緒。在拋出此異常時,當前執行緒的中斷狀態 被清除。
另請參見:
notify(), notifyAll()

finalize

protected void finalize()
                 throws Throwable
當垃圾回收器確定不存在對該物件的更多參考時,由物件的垃圾回收器調用此方法。子類別覆寫 finalize 方法,以配置系統資源或執行其他清除。

finalize 的常規協定是:當 JavaTM 虛擬機器已確定尚未終止的任何執行緒無法再通過任何方法存取此物件時,將調用此方法,除非由於準備終止的其他某個物件或類別的終結操作執行了某個操作。finalize 方法可以採取任何操作,其中包括再次使此物件對其他執行緒可用;不過,finalize 的主要目的是在不可撤消地丟棄物件之前執行清除操作。例如,表示輸入/輸出連接的物件的 finalize 方法可執行顯式 I/O 事務,以便在永久丟棄物件之前中斷連接。

Object 類別的 finalize 方法執行非特殊性操作;它僅執行一些常規返回。Object 的子類別可以覆寫此定義。

Java 程式語言不保證哪個執行緒將調用某個給定物件的 finalize 方法。但可以保證在調用 finalize 時,調用 finalize 的執行緒將不會持有任何使用者可見的同步鎖定。如果 finalize 方法拋出未捕獲的異常,那麼該異常將被忽略,並且該物件的終結操作將終止。

在啟用某個物件的 finalize 方法後,將不會執行進一步操作,直到 Java 虛擬機器再次確定尚未終止的任何執行緒無法再通過任何方法存取此物件,其中包括由準備終止的其他物件或類別執行的可能操作,在執行該操作時,對象可能被丟棄。

對於任何給定物件,Java 虛擬機器最多只調用一次 finalize 方法。

finalize 方法拋出的任何異常都會導致此物件的終結操作停止,但可以通過其他方法忽略它。

拋出:
Throwable - 此方法拋出的 Exception

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only