1、概述:
Object類是全部Java類的祖先。每一個類都使用 Object 做爲超類。全部對象(包括數組)都實現這個類的方法。
在不明確給出超類的狀況下,Java會自動把Object做爲要定義類的超類。
可使用類型爲Object的變量指向任意類型的對象。
Object類有一個默認構造方法pubilc Object(),在構造子類實例時,都會先調用這個默認構造方法。
Object類的變量只能用做各類值的通用持有者。要對他們進行任何專門的操做,都須要知道它們的原始類型並進行類型轉換。例如:
Object obj = new MyObject();
MyObject x = (MyObject)obj; java
2、API預覽
Object()
默認構造方法
clone()
建立並返回此對象的一個副本。
equals(Object obj)
指示某個其餘對象是否與此對象「相等」。
finalize()
當垃圾回收器肯定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。
getClass()
返回一個對象的運行時類。
hashCode()
返回該對象的哈希碼值。
notify()
喚醒在此對象監視器上等待的單個線程。
notifyAll()
喚醒在此對象監視器上等待的全部線程。
toString()
返回該對象的字符串表示。
wait()
致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法。
wait(long timeout)
致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。
wait(long timeout, int nanos)
致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其餘某個線程中斷當前線程,或者已超過某個實際時間量。 程序員
3、方法使用說明
一、equals()方法:用於測試某個對象是否同另外一個對象相等。它在Object類中的實現是判斷兩個對象是否指向同一塊內存區域。這中測試用處不大,由於即便內容相同的對象,內存區域也是不一樣的。若是想測試對象是否相等,就須要覆蓋此方法,進行更有意義的比較。例如
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; 編程
//測試全部的字段是否相等
return name.equals(other.name)
&& salary == other.salary
&& hireDay.equals(other.hireDay);
}
}
Java語言規範要求equals方法具備下面的特色:
自反性:對於任何非空引用值 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。 數組
從這裏看出,上面的例子是Java規範的equals方法的標準實現,推薦用上面例子的寫法實現類的equals方法。 app
二、toString():返回該對象的字符串表示。Object類中的toString()方法會打印出類名和對象的內存位置。幾乎每一個類都會覆蓋該方法,以便打印對該對象當前狀態的表示。大多數(非所有)toString()方法都遵循以下格式:類名[字段名=值,字段名=值...],固然,子類應該定義本身的toString()方法。例如: 編程語言
public String toString(){
reurn "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]";
}
toString()方法是很是重要的調試工具,不少標準類庫中的類都定義了toString()方法,以便程序員得到有用的調試信息。 ide
4、來自SUN公司的java.long.Object類的API文檔,網上有chm中文版的,很好找。爲了查閱方便,我從SUN公司的JavaDoc站點上覆製出來了Object類的API文檔。 工具
java.lang.Object
public class Object
類 Object 是類層次結構的根類。每一個類都使用 Object 做爲超類。全部對象(包括數組)都實現這個類的方法。 性能
從如下版本開始:JDK1.0 另請參見: Class構造方法摘要 |
---|
Object() |
方法摘要 | |
---|---|
protected Object | clone() 建立並返回此對象的一個副本。 |
boolean | equals(Object obj) 指示某個其餘對象是否與此對象「相等」。 |
protected void | finalize() 當垃圾回收器肯定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。 |
Class<? extendsObject> | getClass() 返回一個對象的運行時類。 |
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() 方法,或者其餘某個線程中斷當前線程,或者已超過某個實際時間量。 |
構造方法詳細信息 |
---|
public Object()
方法詳細信息 |
---|
public final Class<? extends Object> getClass()返回一個對象的運行時類。該 Class 對象是由所表示類的 static synchronized 方法鎖定的對象。
public int hashCode()返回該對象的哈希碼值。支持該方法是爲哈希表提供一些優勢,例如, java.util.Hashtable 提供的哈希表。
hashCode 的常規協定是: 測試
實際上,由 Object 類定義的 hashCode 方法確實會針對不一樣的對象返回不一樣的整數。(這通常是經過將該對象的內部地址轉換成一個整數來實現的,可是 JavaTM 編程語言不須要這種實現技巧。)
public boolean equals(Object obj)指示某個其餘對象是否與此對象「相等」。
equals 方法在非空對象引用上實現相等關係:
Object 類的 equals 方法實現對象上差異可能性最大的相等關係;即,對於任何非空引用值 x 和 y,當且僅當 x和 y 引用同一個對象時,此方法才返回 true(x == y 具備值 true)。
注意:當此方法被重寫時,一般有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具備相等的哈希碼。
protected Object clone() throws CloneNotSupportedException建立並返回此對象的一個副本。「副本」的準確含義可能依賴於對象的類。通常來講,對於任何對象 x,若是表達式:
是正確的,則表達式:x.clone() != x
將爲 true,但這些不是絕對條件。通常狀況下是:x.clone().getClass() == x.getClass()
將爲 true,但這不是絕對條件。x.clone().equals(x)
按照慣例,返回的對象應該經過調用 super.clone 得到。若是一個類及其全部的超類(Object 除外)都遵照此約定,則 x.clone().getClass() == x.getClass()。
按照慣例,此方法返回的對象應該獨立於該對象(正被克隆的對象)。要得到此獨立性,在 super.clone 返回對象以前,有必要對該對象的一個或多個字段進行修改。這一般意味着要複製包含正在被克隆對象的內部「深層結構」的全部可變對象,並使用對副本的引用替換對這些對象的引用。若是一個類只包含基本字段或對不變對象的引用,那麼一般不須要修改 super.clone 返回的對象中的字段。
Object 類的 clone 方法執行特定的克隆操做。首先,若是此對象的類不能實現接口 Cloneable,則會拋出CloneNotSupportedException。注意:全部的數組都被視爲實現接口 Cloneable。不然,此方法會建立此對象的類的一個新實例,並像經過分配那樣,嚴格使用此對象相應字段的內容初始化該對象的全部字段;這些字段的內容沒有被自我克隆。因此,此方法執行的是該對象的「淺表複製」,而不「深層複製」操做。
Object 類自己不實現接口 Cloneable,因此在類爲 Object 的對象上調用 clone 方法將會致使在運行時拋出異常。
public String toString()返回該對象的字符串表示。一般, toString 方法會返回一個「以文本方式表示」此對象的字符串。結果應是一個簡明但易於讀懂。建議全部子類都重寫此方法。
Object 類的 toString 方法返回一個字符串,該字符串由類名(對象是該類的一個實例)、at 標記符「@」和此對象哈希碼的無符號十六進制表示組成。換句話說,該方法返回一個字符串,它的值等於:
getClass().getName() + '@' + Integer.toHexString(hashCode())
public final void notify()喚醒在此對象監視器上等待的單個線程。若是全部線程都在此對象上等待,則會選擇喚醒其中一個線程。選擇是任意性的,並在對實現作出決定時發生。線程經過調用其中一個 wait 方法,在對象的監視器上等待。
直到當前的線程放棄此對象上的鎖定,才能繼續執行被喚醒的線程。被喚醒的線程將以常規方式與在該對象上主動同步的其餘全部線程進行競爭;例如,喚醒的線程在做爲鎖定此對象的下一個線程方面沒有可靠的特權或劣勢。
此方法只應由做爲此對象監視器的全部者的線程來調用。經過如下三種方法之一,線程能夠成爲此對象監視器的全部者:
一次只能有一個線程擁有對象的監視器。
public final void notifyAll()喚醒在此對象監視器上等待的全部線程。線程經過調用其中一個 wait 方法,在對象的監視器上等待。
直到當前的線程放棄此對象上的鎖定,才能繼續執行被喚醒的線程。被喚醒的線程將以常規方式與在該對象上主動同步的其餘全部線程進行競爭;例如,喚醒的線程在做爲鎖定此對象的下一個線程方面沒有可靠的特權或劣勢。
此方法只應由做爲此對象監視器的全部者的線程來調用。請參閱 notify 方法,瞭解線程可以成爲監視器全部者的方法的描述。
public final void wait(long timeout) throws InterruptedException致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。
當前的線程必須擁有此對象監視器。
此方法致使當前線程(稱之爲 T)將其自身放置在對象的等待集中,而後放棄此對象上的全部同步要求。出於線程調度目的,線程 T 被禁用,且處於休眠狀態,直到發生如下四種狀況之一:
在沒有被通知、中斷或超時的狀況下,線程還能夠喚醒一個所謂的虛假喚醒 (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 方法,瞭解線程可以成爲監視器全部者的方法的描述。
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 方法,瞭解線程可以成爲監視器全部者的方法的描述。
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 方法,瞭解線程可以成爲監視器全部者的方法的描述。
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 方法拋出的任何異常都會致使此對象的終結操做中止,但能夠經過其餘方法忽略它。