深入研究java.lang.Object類
全部對象(包含數組)都實現這個類的方法。
在不明白給出超類的情況下。Java會自己主動把Object作為要定義類的超類。
能夠使用類型為Object的變量指向隨意類型的對象。
Object類有一個默認構造方法pubilc Object(),在構造子類實例時,都會先調用這個默認構造方法。
Object類的變量僅僅能用作各種值的通用持有者。要對他們進行不論什麽專門的操作,都須要知道它們的原始類型並進行類型轉換。
比如:
Object obj = new MyObject();
MyObject x = (MyObject)obj;
notify()
喚醒在此對象監視器上等待的單個線程。
notifyAll()
喚醒在此對象監視器上等待的全部線程。
toString()
返回該對象的字符串表示。
wait()
導致當前的線程等待,直到其它線程調用此對象的 notify() 方法或 notifyAll() 方法。
wait(long timeout)
導致當前的線程等待,直到其它線程調用此對象的 notify() 方法或 notifyAll() 方法。或者超過指定的時間量。
wait(long timeout, int nanos)
導致當前的線程等待。直到其它線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其它某個線程中斷當前線程,或者已超過某個實際時間量。
這中測試用處不大,由於即使內容同樣的對象。內存區域也是不同的。假設想測試對象是否相等。就須要覆蓋此方法。進行更有意義的比較。比如
class Employee{
... //此樣例來自《java核心技術》卷一
public boolean equals(Object otherObj){
//高速測試是否是同一個對象
if(this == otherObj) return true;
//假設顯式參數為null,必須返回false
if(otherObj == null) reutrn false;
//假設類不匹配。就不可能相等
if(getClass() != otherObj.getClass()) return false;
//如今已經知道otherObj是個非空的Employee對象
Employee other = (Employee)otherObj;
對於不論什麽非空引用值 x,x.equals(null) 都應返回 false。
大多數(非所有)toString()方法都遵循例如以下格式:類名[字段名=值,字段名=值...]。當然,子類應該定義自己的toString()方法。比如:
這樣做的目的是。對於不論什麽對象 x。
線程通過調用當中一個 wait 方法,在對象的監視器上等待。
直到當前線程放棄此對象上的鎖定,才幹繼續運行被喚醒的線程。被喚醒的線程將以常規方式與在該對象上主動同步的其它全部線程進行競爭。比如,喚醒的線程在作為鎖定此對象的下一個線程方面沒有可靠的特權或劣勢。
此方法僅僅應由作為此對象監視器的全部者的線程來調用。通過下面三種方法之中的一個,線程能夠成為此對象監視器的全部者:
- 通過運行此對象的同步實例方法。
- 通過運行在此對象上進行同步的
synchronized
語句的正文。 - 對於
Class
類型的對象,能夠通過運行該類的同步靜態方法。
一次僅僅能有一個線程擁有對象的監視器。
wait
方法,在對象的監視器上等待。
直到當前線程放棄此對象上的鎖定。才幹繼續運行被喚醒的線程。
被喚醒的線程將以常規方式與在該對象上主動同步的其它全部線程進行競爭。比如,喚醒的線程在作為鎖定此對象的下一個線程方面沒有可靠的特權或劣勢。
6、wait(long timeout):在其它線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前。導致當前線程等待。
當前線程必須擁有此對象監視器。
此方法導致當前線程(稱之為 T)將其自身放置在對象的等待集中,然後放棄此對象上的全部同步要求。
出於線程調度目的,在發生下面四種情況之中的一個前,線程 T 被禁用,且處於休眠狀態:
- 其它某個線程調用此對象的 notify 方法。而且線程 T 碰巧被任選為被喚醒的線程。
- 其它某個線程調用此對象的 notifyAll 方法。
- 其它某個線程中斷線程 T。
- 大約已經到達指定的實際時間。可是,假設 timeout 為零,則不考慮實際時間。在獲得通知前該線程將一直等待。 然後。從對象的等待集中刪除線程 T。並又一次進行線程調度。然後,該線程以常規方式與其它線程競爭,以獲得在該對象上同步的權利。一旦獲得對該對象的控制權,該對象上的全部其同步聲明都將被恢復到曾經的狀態,這就是調用 wait 方法時的情況。
然後,線程 T 從 wait 方法的調用中返回。所以。從 wait 方法返回時。該對象和線程 T 的同步狀態與調用 wait 方法時的情況全然同樣。
換句話說。等待應總是發生在循環中,如以下的演示樣例:
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
}
7、wait(long timeout, int nanos):在其它線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其它某個線程中斷當前線程,或者已超過某個實際時間量前。導致當前線程等待。
此方法類似於一個參數的 wait 方法,但它同意更好地控制在放棄之前等待通知的時間量。用毫微秒度量的實際時間量能夠通過下面公式計算出來:1000000*timeout+nanos在其它全部方面。此方法運行的操作與帶有一個參數的 wait(long) 方法同樣。須要特別指出的是,wait(0, 0) 與 wait(0) 同樣。
- 其它線程通過調用 notify 方法,或 notifyAll 方法通知在此對象的監視器上等待的線程醒來。
- timeout 毫秒值與 nanos 毫微秒參數值之和指定的超時時間已用完。
對於某一個參數的版本號,實現中斷和虛假喚醒是有可能的,而且此方法應始終在循環中使用:
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout, nanos);
... // Perform action appropriate to condition
}
然後該線程將等到又一次獲得對監視器的全部權後才幹繼續運行。
子類重寫 finalize 方法。以配置系統資源或運行其它清除。
finalize 的常規協定是:當 JavaTM 虛擬機已確定尚未終止的不論什麽線程無法再通過不論什麽方法訪問此對象時,將調用此方法。除非因為準備終止的其它某個對象或類的終結操作運行了某個操作。
finalize 方法能夠採取不論什麽操作,當中包含再次使此對象對其它線程可用;只是。finalize 的主要目的是在不可撤消地丟棄對象之前運行清除操作。比如。表示輸入/輸出連接的對象的 finalize 方法可運行顯式 I/O 事務。以便在永久丟棄對象之前中斷連接。
Object 的子類能夠重寫此定義。
深入研究java.lang.Object類