類Object是類層次結(jié)構(gòu)的根類,每一個(gè)類都使用Object作為超類,所有對(duì)象(包括數(shù)組)都實(shí)現(xiàn)這個(gè)類的方法。jdk1.5中,描述了該類中的11個(gè)方法
1.getClass
public final Class<? extends Object> getClass()
- 返回一個(gè)對(duì)象的運(yùn)行時(shí)類。該 Class 對(duì)象是由所表示類的 static synchronized 方法鎖定的對(duì)象。
-
- 返回:
- 表示該對(duì)象的運(yùn)行時(shí)類的
java.lang.Class
對(duì)象。此結(jié)果屬于類型 Class<? extends X>
,其中 X 表示清除表達(dá)式中的靜態(tài)類型,該表達(dá)式調(diào)用 getClass
。
2.hashCode
public int hashCode()
- 返回該對(duì)象的哈希碼值。支持該方法是為哈希表提供一些優(yōu)點(diǎn),例如,
java.util.Hashtable
提供的哈希表。
hashCode
的常規(guī)協(xié)定是:
- 在 Java 應(yīng)用程序執(zhí)行期間,在同一對(duì)象上多次調(diào)用 hashCode 方法時(shí),必須一致地返回相同的整數(shù),前提是對(duì)象上 equals 比較中所用的信息沒(méi)有被修改。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行,該整數(shù)無(wú)需保持一致。
- 如果根據(jù) equals(Object) 方法,兩個(gè)對(duì)象是相等的,那么在兩個(gè)對(duì)象中的每個(gè)對(duì)象上調(diào)用
hashCode
方法都必須生成相同的整數(shù)結(jié)果。
- 以下情況不 是必需的:如果根據(jù)
equals(java.lang.Object)
方法,兩個(gè)對(duì)象不相等,那么在兩個(gè)對(duì)象中的任一對(duì)象上調(diào)用 hashCode 方法必定會(huì)生成不同的整數(shù)結(jié)果。但是,程序員應(yīng)該知道,為不相等的對(duì)象生成不同整數(shù)結(jié)果可以提高哈希表的性能。
實(shí)際上,由 Object 類定義的 hashCode 方法確實(shí)會(huì)針對(duì)不同的對(duì)象返回不同的整數(shù)。(這一般是通過(guò)將該對(duì)象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)來(lái)實(shí)現(xiàn)的,但是 JavaTM 編程語(yǔ)言不需要這種實(shí)現(xiàn)技巧。)
-
- 返回:
- 此對(duì)象的一個(gè)哈希碼值。
3.equals
public boolean equals(Object obj)
- 指示某個(gè)其他對(duì)象是否與此對(duì)象“相等”。
equals
方法在非空對(duì)象引用上實(shí)現(xiàn)相等關(guān)系:
- 自反性:對(duì)于任何非空引用值
x
,x.equals(x)
都應(yīng)返回 true
。
- 對(duì)稱性:對(duì)于任何非空引用值
x
和 y
,當(dāng)且僅當(dāng) y.equals(x)
返回 true
時(shí),x.equals(y)
才應(yīng)返回 true
。
- 傳遞性:對(duì)于任何非空引用值
x
、y
和 z
,如果 x.equals(y)
返回 true
,并且 y.equals(z)
返回 true
,那么 x.equals(z)
應(yīng)返回 true
。
- 一致性:對(duì)于任何非空引用值
x
和 y
,多次調(diào)用 x.equals(y) 始終返回 true
或始終返回 false
,前提是對(duì)象上 equals
比較中所用的信息沒(méi)有被修改。
- 對(duì)于任何非空引用值
x
,x.equals(null)
都應(yīng)返回 false
。
Object
類的 equals 方法實(shí)現(xiàn)對(duì)象上差別可能性最大的相等關(guān)系;即,對(duì)于任何非空引用值 x
和 y
,當(dāng)且僅當(dāng) x
和 y
引用同一個(gè)對(duì)象時(shí),此方法才返回 true
(x == y
具有值 true
)。
注意:當(dāng)此方法被重寫(xiě)時(shí),通常有必要重寫(xiě) hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對(duì)象必須具有相等的哈希碼。
-
- 參數(shù):
obj
- 要與之比較的引用對(duì)象。
- 返回:
- 如果此對(duì)象與 obj 參數(shù)相同,則返回
true
;否則返回 false
。
4.clone
protected Object clone()
throws CloneNotSupportedException
- 創(chuàng)建并返回此對(duì)象的一個(gè)副本。“副本”的準(zhǔn)確含義可能依賴于對(duì)象的類。一般來(lái)說(shuō),對(duì)于任何對(duì)象 x,如果表達(dá)式:
x.clone() != x
是正確的,則表達(dá)式:
x.clone().getClass() == x.getClass()
將為 true,但這些不是絕對(duì)條件。一般情況下是:
x.clone().equals(x)
將為 true,但這不是絕對(duì)條件。
按照慣例,返回的對(duì)象應(yīng)該通過(guò)調(diào)用 super.clone 獲得。如果一個(gè)類及其所有的超類(Object 除外)都遵守此約定,則 x.clone().getClass() == x.getClass()。
按照慣例,此方法返回的對(duì)象應(yīng)該獨(dú)立于該對(duì)象(正被克隆的對(duì)象)。要獲得此獨(dú)立性,在 super.clone 返回對(duì)象之前,有必要對(duì)該對(duì)象的一個(gè)或多個(gè)字段進(jìn)行修改。這通常意味著要復(fù)制包含正在被克隆對(duì)象的內(nèi)部“深層結(jié)構(gòu)”的所有可變對(duì)象,并使用對(duì)副本的引用替換對(duì)這些對(duì)象的引用。如果一個(gè)類只包含基本字段或?qū)Σ蛔儗?duì)象的引用,那么通常不需要修改 super.clone 返回的對(duì)象中的字段。
Object 類的 clone 方法執(zhí)行特定的克隆操作。首先,如果此對(duì)象的類不能實(shí)現(xiàn)接口 Cloneable,則會(huì)拋出 CloneNotSupportedException。注意:所有的數(shù)組都被視為實(shí)現(xiàn)接口 Cloneable。否則,此方法會(huì)創(chuàng)建此對(duì)象的類的一個(gè)新實(shí)例,并像通過(guò)分配那樣,嚴(yán)格使用此對(duì)象相應(yīng)字段的內(nèi)容初始化該對(duì)象的所有字段;這些字段的內(nèi)容沒(méi)有被自我克隆。所以,此方法執(zhí)行的是該對(duì)象的“淺表復(fù)制”,而不“深層復(fù)制”操作。
Object 類本身不實(shí)現(xiàn)接口 Cloneable,所以在類為 Object 的對(duì)象上調(diào)用 clone 方法將會(huì)導(dǎo)致在運(yùn)行時(shí)拋出異常。
-
- 返回:
- 此實(shí)例的一個(gè)克隆。
- 拋出:
CloneNotSupportedException
- 如果對(duì)象的類不支持 Cloneable
接口,則重寫(xiě) clone
方法的子類也會(huì)拋出此異常,以指示無(wú)法克隆某個(gè)實(shí)例。
5.toString
public String toString()
- 返回該對(duì)象的字符串表示。通常,
toString
方法會(huì)返回一個(gè)“以文本方式表示”此對(duì)象的字符串。結(jié)果應(yīng)是一個(gè)簡(jiǎn)明但易于讀懂。建議所有子類都重寫(xiě)此方法。
Object
類的 toString
方法返回一個(gè)字符串,該字符串由類名(對(duì)象是該類的一個(gè)實(shí)例)、at 標(biāo)記符“@
”和此對(duì)象哈希碼的無(wú)符號(hào)十六進(jìn)制表示組成。換句話說(shuō),該方法返回一個(gè)字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
-
- 返回:
- 該對(duì)象的字符串表示形式。
6.notify
public final void notify()
- 喚醒在此對(duì)象監(jiān)視器上等待的單個(gè)線程。如果所有線程都在此對(duì)象上等待,則會(huì)選擇喚醒其中一個(gè)線程。選擇是任意性的,并在對(duì)實(shí)現(xiàn)做出決定時(shí)發(fā)生。線程通過(guò)調(diào)用其中一個(gè)
wait
方法,在對(duì)象的監(jiān)視器上等待。
直到當(dāng)前的線程放棄此對(duì)象上的鎖定,才能繼續(xù)執(zhí)行被喚醒的線程。被喚醒的線程將以常規(guī)方式與在該對(duì)象上主動(dòng)同步的其他所有線程進(jìn)行競(jìng)爭(zhēng);例如,喚醒的線程在作為鎖定此對(duì)象的下一個(gè)線程方面沒(méi)有可靠的特權(quán)或劣勢(shì)。
此方法只應(yīng)由作為此對(duì)象監(jiān)視器的所有者的線程來(lái)調(diào)用。通過(guò)以下三種方法之一,線程可以成為此對(duì)象監(jiān)視器的所有者:
- 通過(guò)執(zhí)行此對(duì)象的同步 (Sychronized) 實(shí)例方法。
- 通過(guò)執(zhí)行在此對(duì)象上進(jìn)行同步的
synchronized
語(yǔ)句的正文。
- 對(duì)于
Class
類型的對(duì)象,可以通過(guò)執(zhí)行該類的同步靜態(tài)方法。
一次只能有一個(gè)線程擁有對(duì)象的監(jiān)視器。
-
- 拋出:
IllegalMonitorStateException
- 如果當(dāng)前的線程不是此對(duì)象監(jiān)視器的所有者。
7.notifyAll
public final void notifyAll()
- 喚醒在此對(duì)象監(jiān)視器上等待的所有線程。線程通過(guò)調(diào)用其中一個(gè)
wait
方法,在對(duì)象的監(jiān)視器上等待。
直到當(dāng)前的線程放棄此對(duì)象上的鎖定,才能繼續(xù)執(zhí)行被喚醒的線程。被喚醒的線程將以常規(guī)方式與在該對(duì)象上主動(dòng)同步的其他所有線程進(jìn)行競(jìng)爭(zhēng);例如,喚醒的線程在作為鎖定此對(duì)象的下一個(gè)線程方面沒(méi)有可靠的特權(quán)或劣勢(shì)。
此方法只應(yīng)由作為此對(duì)象監(jiān)視器的所有者的線程來(lái)調(diào)用。請(qǐng)參閱 notify
方法,了解線程能夠成為監(jiān)視器所有者的方法的描述。
-
- 拋出:
IllegalMonitorStateException
- 如果當(dāng)前的線程不是此對(duì)象監(jiān)視器的所有者。
8.finalize
protected void finalize()
throws Throwable
- 當(dāng)垃圾回收器確定不存在對(duì)該對(duì)象的更多引用時(shí),由對(duì)象的垃圾回收器調(diào)用此方法。子類重寫(xiě)
finalize
方法,以配置系統(tǒng)資源或執(zhí)行其他清除。
finalize 的常規(guī)協(xié)定是:當(dāng) JavaTM 虛擬機(jī)已確定尚未終止的任何線程無(wú)法再通過(guò)任何方法訪問(wèn)此對(duì)象時(shí),將調(diào)用此方法,除非由于準(zhǔn)備終止的其他某個(gè)對(duì)象或類的終結(jié)操作執(zhí)行了某個(gè)操作。finalize 方法可以采取任何操作,其中包括再次使此對(duì)象對(duì)其他線程可用;不過(guò),finalize 的主要目的是在不可撤消地丟棄對(duì)象之前執(zhí)行清除操作。例如,表示輸入/輸出連接的對(duì)象的 finalize 方法可執(zhí)行顯式 I/O 事務(wù),以便在永久丟棄對(duì)象之前中斷連接。
Object 類的 finalize 方法執(zhí)行非特殊性操作;它僅執(zhí)行一些常規(guī)返回。Object 的子類可以重寫(xiě)此定義。
Java 編程語(yǔ)言不保證哪個(gè)線程將調(diào)用某個(gè)給定對(duì)象的 finalize 方法。但可以保證在調(diào)用 finalize 時(shí),調(diào)用 finalize 的線程將不會(huì)持有任何用戶可見(jiàn)的同步鎖定。如果 finalize 方法拋出未捕獲的異常,那么該異常將被忽略,并且該對(duì)象的終結(jié)操作將終止。
在啟用某個(gè)對(duì)象的 finalize 方法后,將不會(huì)執(zhí)行進(jìn)一步操作,直到 Java 虛擬機(jī)再次確定尚未終止的任何線程無(wú)法再通過(guò)任何方法訪問(wèn)此對(duì)象,其中包括由準(zhǔn)備終止的其他對(duì)象或類執(zhí)行的可能操作,在執(zhí)行該操作時(shí),對(duì)象可能被丟棄。
對(duì)于任何給定對(duì)象,Java 虛擬機(jī)最多只調(diào)用一次 finalize 方法。
finalize
方法拋出的任何異常都會(huì)導(dǎo)致此對(duì)象的終結(jié)操作停止,但可以通過(guò)其他方法忽略它。
-
- 拋出:
Throwable
- 此方法拋出的 Exception
9.wait
public final void wait(long timeout)
throws InterruptedException
- 導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的
notify()
方法或 notifyAll()
方法,或者超過(guò)指定的時(shí)間量。
當(dāng)前的線程必須擁有此對(duì)象監(jiān)視器。
此方法導(dǎo)致當(dāng)前線程(稱之為 T)將其自身放置在對(duì)象的等待集中,然后放棄此對(duì)象上的所有同步要求。出于線程調(diào)度目的,線程 T 被禁用,且處于休眠狀態(tài),直到發(fā)生以下四種情況之一:
- 其他某個(gè)線程調(diào)用此對(duì)象的 notify 方法,并且線程 T 碰巧被任選為被喚醒的線程。
- 其他某個(gè)線程調(diào)用此對(duì)象的 notifyAll 方法。
- 其他某個(gè)線程
中斷
線程 T。
- 已經(jīng)到達(dá)指定的實(shí)際時(shí)間。但是,如果 timeout 為零,則不考慮實(shí)際時(shí)間,該線程將一直等待,直到獲得通知。
然后,從對(duì)象的等待集中刪除線程 T,并重新進(jìn)行線程調(diào)度。然后,該線程以常規(guī)方式與其他線程競(jìng)爭(zhēng),以獲得在該對(duì)象上同步的權(quán)利;一旦獲得對(duì)該對(duì)象的控制權(quán),該對(duì)象上的所有其同步聲明都將被還原到以前的狀態(tài) - 這就是調(diào)用 wait 方法時(shí)的情況。然后,線程 T 從 wait 方法的調(diào)用中返回。所以,從 wait 方法返回時(shí),該對(duì)象和線程 T 的同步狀態(tài)與調(diào)用 wait 方法時(shí)的情況完全相同。
在沒(méi)有被通知、中斷或超時(shí)的情況下,線程還可以喚醒一個(gè)所謂的虛假喚醒 (spurious wakeup)。雖然這種情況在實(shí)踐中很少發(fā)生,但是應(yīng)用程序必須通過(guò)以下方式防止其發(fā)生,即對(duì)應(yīng)該導(dǎo)致該線程被提醒的條件進(jìn)行測(cè)試,如果不滿足該條件,則繼續(xù)等待。換句話說(shuō),等待應(yīng)總是發(fā)生在循環(huán)中,如下面的示例:
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
}
(有關(guān)這一主題的更多信息,請(qǐng)參閱 Doug Lea 撰寫(xiě)的《Concurrent Programming in Java (Second Edition)》(Addison-Wesley, 2000) 中的第 3.2.3 節(jié)或 Joshua Bloch 撰寫(xiě)的《Effective Java Programming Language Guide》(Addison-Wesley, 2001) 中的第 50 項(xiàng)。
如果當(dāng)前線程在等待時(shí)被其他線程中斷
,則會(huì)拋出 InterruptedException。在按上述形式恢復(fù)此對(duì)象的鎖定狀態(tài)時(shí)才會(huì)拋出此異常。
注意,由于 wait 方法將當(dāng)前的線程放入了對(duì)象的等待集中,所以它只能解除此對(duì)象的鎖定;可以同步當(dāng)前線程的任何其他對(duì)象在線程等待時(shí)仍處于鎖定狀態(tài)。
此方法只應(yīng)由作為此對(duì)象監(jiān)視器的所有者的線程來(lái)調(diào)用。請(qǐng)參閱 notify
方法,了解線程能夠成為監(jiān)視器所有者的方法的描述。
- 參數(shù):
timeout
- 要等待的最長(zhǎng)時(shí)間(以毫秒為單位)。
- 拋出:
IllegalArgumentException
- 如果超時(shí)值為負(fù)。
IllegalMonitorStateException
- 如果當(dāng)前的線程不是此對(duì)象監(jiān)視器的所有者。
InterruptedException
- 如果在當(dāng)前線程等待通知之前或者正在等待通知時(shí),另一個(gè)線程中斷了當(dāng)前線程。在拋出此異常時(shí),當(dāng)前線程的中斷狀態(tài) 被清除。
10.wait
public final void wait(long timeout,
int nanos)
throws InterruptedException
- 導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的
notify()
方法或 notifyAll()
方法,或者其他某個(gè)線程中斷當(dāng)前線程,或者已超過(guò)某個(gè)實(shí)際時(shí)間量。
此方法類似于一個(gè)參數(shù)的 wait
方法,但它允許更好地控制在放棄之前等待通知的時(shí)間量。用毫微秒度量的實(shí)際時(shí)間量可以通過(guò)以下公式計(jì)算出來(lái):
1000000*timeout+nanos
在其他所有方面,此方法執(zhí)行的操作與帶有一個(gè)參數(shù)的 wait(long)
方法相同。需要特別指出的是,wait(0, 0) 與 wait(0) 相同。
當(dāng)前的線程必須擁有此對(duì)象監(jiān)視器。該線程發(fā)布對(duì)此監(jiān)視器的所有權(quán),并等待下面兩個(gè)條件之一發(fā)生:
- 其他線程通過(guò)調(diào)用
notify
方法,或 notifyAll
方法通知在此對(duì)象的監(jiān)視器上等待的線程醒來(lái)。
timeout
毫秒值與 nanos
毫微秒?yún)?shù)值之和指定的超時(shí)時(shí)間已用完。
然后,該線程等到重新獲得對(duì)監(jiān)視器的所有權(quán)后才能繼續(xù)執(zhí)行。
對(duì)于某一個(gè)參數(shù)的版本,實(shí)現(xiàn)中斷和虛假喚醒是有可能的,并且此方法應(yīng)始終在循環(huán)中使用:
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout, nanos);
... // Perform action appropriate to condition
}
此方法只應(yīng)由作為此對(duì)象監(jiān)視器的所有者的線程來(lái)調(diào)用。請(qǐng)參閱 notify
方法,了解線程能夠成為監(jiān)視器所有者的方法的描述。
- 參數(shù):
timeout
- 要等待的最長(zhǎng)時(shí)間(以毫秒為單位)。
nanos
- 額外時(shí)間(以毫微秒為單位,范圍是 0-999999)。
- 拋出:
IllegalArgumentException
- 如果超時(shí)值是負(fù)數(shù),或者毫微秒值不在 0-999999 范圍內(nèi)。
IllegalMonitorStateException
- 如果當(dāng)前線程不是此對(duì)象監(jiān)視器的所有者。
InterruptedException
- 如果在當(dāng)前線程等待通知之前或者正在等待通知時(shí),其他線程中斷了當(dāng)前線程。在拋出此異常時(shí),當(dāng)前線程的中斷狀態(tài) 被清除。
11.wait
public final void wait()
throws InterruptedException
- 導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的
notify()
方法或 notifyAll()
方法。換句話說(shuō),此方法的行為就好像它僅執(zhí)行 wait(0) 調(diào)用一樣。
當(dāng)前的線程必須擁有此對(duì)象監(jiān)視器。該線程發(fā)布對(duì)此監(jiān)視器的所有權(quán)并等待,直到其他線程通過(guò)調(diào)用 notify
方法,或 notifyAll
方法通知在此對(duì)象的監(jiān)視器上等待的線程醒來(lái)。然后該線程將等到重新獲得對(duì)監(jiān)視器的所有權(quán)后才能繼續(xù)執(zhí)行。
對(duì)于某一個(gè)參數(shù)的版本,實(shí)現(xiàn)中斷和虛假喚醒是可能的,而且此方法應(yīng)始終在循環(huán)中使用:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
此方法只應(yīng)由作為此對(duì)象監(jiān)視器的所有者的線程來(lái)調(diào)用。請(qǐng)參閱 notify
方法,了解線程能夠成為監(jiān)視器所有者的方法的描述。
- 拋出:
IllegalMonitorStateException
- 如果當(dāng)前的線程不是此對(duì)象監(jiān)視器的所有者。
InterruptedException
- 如果在當(dāng)前線程等待通知之前或者正在等待通知時(shí),另一個(gè)線程中斷了當(dāng)前線程。在拋出此異常時(shí),當(dāng)前線程的中斷狀態(tài) 被清除。
-
posted on 2008-12-05 10:25
jiafang83 閱讀(8166)
評(píng)論(0) 編輯 收藏