Object作為超類
java.lang包中的Object類位于類層次結(jié)構(gòu)樹的頂部,每個類都是Object類的直接或間接的后代,你使用或編寫的每個類都繼承Object的實(shí)例方法,你不需要使用任何這些方法,但是,如果你選擇這樣做,你可能需要使用特定于你的類的代碼重寫它們,本節(jié)中討論的從Object繼承的方法是:
protected Object clone() throws CloneNotSupportedException
創(chuàng)建并返回此對象的副本。
public boolean equals(Object obj)
指示某個其他對象是否“等于”此對象。
protected void finalize() throws Throwable
垃圾回收器在對象上執(zhí)行垃圾回收時調(diào)用。
集合確定不再有對該對象的引用。
public final Class getClass()
返回對象的運(yùn)行時類。
public int hashCode()
返回對象的哈希碼值。
public String toString()
返回對象的字符串表示形式。
Object的notify、notifyAll和wait方法都在同步程序中獨(dú)立運(yùn)行的線程的活動中發(fā)揮作用,這將在后面的課程中討論,這里不討論,有五個方法:
public final void notify()
public final void notifyAll()
public final void wait()
public final void wait(long timeout)
public final void wait(long timeout, int nanos)
注意:許多方法都有一些微妙的方面,尤其是clone方法。clone()方法
如果某個類或其中一個超類實(shí)現(xiàn)了Cloneable接口,則可以使用clone()方法從現(xiàn)有對象創(chuàng)建副本,要創(chuàng)建克隆,請編寫:
aCloneableObject.clone();
Object的此方法實(shí)現(xiàn)檢查調(diào)用clone()的對象是否實(shí)現(xiàn)Cloneable接口,如果對象沒有,則該方法拋出CloneNotSupportedException異常,稍后的課程將介紹異常處理,目前,你需要知道clone()必須聲明為:
protected Object clone() throws CloneNotSupportedException
或
public Object clone() throws CloneNotSupportedException
如果要編寫clone()方法來覆蓋Object中的方法。
如果調(diào)用clone()的對象確實(shí)實(shí)現(xiàn)了Cloneable接口,對象的clone()方法實(shí)現(xiàn)創(chuàng)建與原始對象相同的類的對象,并初始化新對象的成員變量,使其具有與原始對象的相應(yīng)成員變量相同的值。
使類可克隆的最簡單方法是將implements Cloneable添加到類的聲明中,然后你的對象可以調(diào)用clone()方法。
對于某些類,Object的clone()方法的默認(rèn)行為可以正常工作,但是,如果一個對象包含對外部對象的引用,比如說ObjExternal,則可能需要重寫clone()以獲得正確的行為,否則,一個對象對ObjExternal所做的更改也將在其克隆中可見,這意味著原始對象及其克隆不是獨(dú)立的 — 要將它們分離,你必須重寫clone()以便它克隆對象和ObjExternal,然后原始對象引用ObjExternal,并且克隆引用ObjExternal的克隆,以便對象及其克隆真正獨(dú)立。
equals()方法equals()方法將兩個對象進(jìn)行相等性比較,如果它們相等則返回true,Object類中提供的equals()方法使用標(biāo)識運(yùn)算符(==)來確定兩個對象是否相等。對于原始數(shù)據(jù)類型,這會給出正確的結(jié)果,但是,對于對象,它沒有,Object提供的equals()方法測試對象引用是否相等 — 即,如果比較的對象是完全相同的對象。
要測試兩個對象在等價意義上是否相等(包含相同的信息),必須重寫equals()方法,以下是重寫equals()的Book類的示例:
public class Book { ... public boolean equals(Object obj) { if (obj instanceof Book) return ISBN.equals((Book)obj.getISBN()); else return false; } }
考慮這段代碼來測試Book類的兩個實(shí)例是否相等:
// Swing Tutorial, 2nd edition Book firstBook = new Book("0201914670"); Book secondBook = new Book("0201914670"); if (firstBook.equals(secondBook)) { System.out.println("objects are equal"); } else { System.out.println("objects are not equal"); }
即使firstBook和secondBook引用了兩個不同的對象,此程序也顯示對objects are equal,它們被認(rèn)為是相同的,因?yàn)楸容^的對象包含相同的ISBN號。
如果標(biāo)識運(yùn)算符不適合你的類,則應(yīng)始終重寫equals()方法。
注意:如果重寫equals(),則還必須重寫hashCode()。finalize()方法
Object類提供了一個回調(diào)方法finalize(),當(dāng)它變?yōu)槔鴷r,可以在對象上調(diào)用它,Object的finalize()實(shí)現(xiàn)什么也沒做 — 你可以重寫finalize()來執(zhí)行清理,例如釋放資源。
finalize()方法可以由系統(tǒng)自動調(diào)用,但是什么時候調(diào)用,或者即使調(diào)用,也是不確定的,因此,你不應(yīng)該依賴此方法為你進(jìn)行清理。例如,如果在執(zhí)行I/O后沒有在代碼中關(guān)閉文件描述符,并且你希望finalize()為你關(guān)閉它們,則可能會耗盡文件描述符。
getClass()方法你不能重寫getClass。
getClass()方法返回一個Class對象,該對象具有可用于獲取有關(guān)類的信息的方法,例如其名稱(getSimpleName()),其超類(getSuperclass())及其實(shí)現(xiàn)的接口(getInterfaces()),例如,以下方法獲取并顯示對象的類名:
void printClassName(Object obj) { System.out.println("The object"s" + " class is " + obj.getClass().getSimpleName()); }
java.lang包中的Class類有很多方法(超過50個),例如,你可以測試以查看類是注解(isAnnotation()),接口(isInterface())還是枚舉(isEnum()),你可以查看對象的字段是什么(getFields())或其方法是什么(getMethods()),等等。
hashCode()方法hashCode()返回的值是對象的哈希碼,它是十六進(jìn)制的對象的內(nèi)存地址。
根據(jù)定義,如果兩個對象相等,則它們的哈希碼也必須相等,如果重寫equals()方法,則更改了兩個對象的等效方式,并且Object的hashCode()實(shí)現(xiàn)不再有效,因此,如果重寫equals()方法,則還必須重寫hashCode()方法。
toString()方法你應(yīng)該始終考慮重寫你的類中的toString()方法。
Object的toString()方法返回對象的String表示,這對調(diào)試非常有用,對象的String表示完全取決于對象,這就是你需要在類中重寫toString()的原因。
你可以使用toString()和System.out.println()來顯示對象的文本表示形式,例如Book的實(shí)例:
System.out.println(firstBook.toString());
對于正確重寫的toString()方法,它會打印一些有用的東西,如下所示:
ISBN: 0201914670; The Swing Tutorial; A Guide to Constructing GUIs, 2nd Edition上一篇:使用super關(guān)鍵字 下一篇:抽象方法和類
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72874.html
繼承 在前面的課程中,你已經(jīng)多次看到了繼承,在Java語言中,類可以從其他類派生,從而從這些類繼承字段和方法。 定義:從另一個類派生的類稱為子類(也是派生類,擴(kuò)展類或子類),派生子類的類稱為超類(也是基類或父類)。 除了Object沒有超類,每個類都有一個且只有一個直接超類(單繼承),在沒有任何其他顯式超類的情況下,每個類都隱式地是Object的子類。 類可以從派生自類的類派生的類派生,依此類推,...
使用super關(guān)鍵字 訪問超類成員 如果你的方法覆蓋了它的一個超類的方法,你可以通過使用關(guān)鍵字super來調(diào)用被重寫的方法,你也可以使用super來引用隱藏字段(盡管不鼓勵隱藏字段),慮這個類,Superclass: public class Superclass { public void printMethod() { System.out.println(Print...
摘要:使用反射可以在運(yùn)行時檢視類。類名類修飾符等包信息超類所實(shí)現(xiàn)的接口構(gòu)造函數(shù)方法屬性注解類中附加了很多信息,你可以在獲得一個完整列表。全限定名包含所有的包名。構(gòu)造函數(shù)你可以訪問類的構(gòu)造函數(shù),代碼如下構(gòu)造函數(shù)的詳細(xì)教程在章節(jié)。 使用反射可以在運(yùn)行時檢視Java類。檢視類通常是使用反射時所做的第一件事情。從類中可以獲得下面的信息。 類名 類修飾符(private、public、synchro...
將接口用作類型 定義新接口時,你將定義新的引用數(shù)據(jù)類型,你可以在任何可以使用任何其他數(shù)據(jù)類型名稱的地方使用接口名稱,如果定義類型為接口的引用變量,則分配給它的任何對象都必須是實(shí)現(xiàn)接口的類的實(shí)例。 作為示例,這里是一種用于查找一對對象中的最大對象的方法,用于從實(shí)現(xiàn)Relatable的類實(shí)例化的任何對象: public Object findLargest(Object object1, Object...
類 在標(biāo)題為面向?qū)ο蟮木幊谈拍钫n程中對面向?qū)ο蟾拍畹慕榻B以自行車課為例,以賽車,山地自行車和雙人自行車為子類,下面是可能實(shí)現(xiàn)Bicycle類的示例代碼,為你提供類聲明的概述,本課程的后續(xù)部分將逐步備份和解釋類聲明,目前,不要關(guān)心細(xì)節(jié)。 public class Bicycle { // the Bicycle class has // three fields ...
閱讀 869·2021-11-25 09:44
閱讀 1086·2021-11-19 09:40
閱讀 7119·2021-09-07 10:23
閱讀 1992·2019-08-28 17:51
閱讀 1118·2019-08-26 10:59
閱讀 1943·2019-08-26 10:25
閱讀 3149·2019-08-23 18:22
閱讀 875·2019-08-23 16:58