java核心技術卷I-Object

Object: 所有類的超類

Object 類是 Java 中所有類的始祖, 在 Java 中每個類都是由它擴展而來的。
在 Java 中,只有基本類型 ( primitive types) 不是對象, 例如,數值、 字符和布爾類型的值都不是對象。

equals 方法

Object 類中的 equals 方法用於檢測一個對象是否等於另外一個對象。在 Object 類中,這個方法將判斷兩個對象是否具有相同的引用。如果兩個對象具有相同的引用, 它們一定是相等的
Java 語言規範要求 equals 方法具有下面的特性:
1 ) 自反性:對於任何非空引用 x, x.equals(x) 應該返回 true。
2 ) 對稱性: 對於任何引用 x 和 y, 當且僅當 y.equals(x) 返回 true , x.equals(y) 也應該返回 true。
3 ) 傳遞性: 對於任何引用 x、 y 和 z, 如果 x.equals(y) 返 N true, y.equals(z) 返回 true, x.equals(z) 也應該返回 true。
4 ) 一致性: 如果 x 和 y 引用的對象沒有發生變化,反覆調用 x.equals(y) 應該返回同樣的結果。
5 ) 對於任意非空引用 x, x.equals(null) 應該返回 false,

下面給出編寫一個完美的 equals 方法的建議:
1 ) 顯式參數命名爲 otherObject, 稍後需要將它轉換成另一個叫做 other 的變量。
2 ) 檢測 this 與 otherObject 是否引用同一個對象:

if (this = otherObject) return true;

這條語句只是一個優化。實際上,這是一種經常採用的形式。因爲計算這個等式要比一個一個地比較類中的域所付出的代價小得多。
3 ) 檢測 otherObject 是否爲 null, 如 果 爲 null, 返 回 false。這項檢測是很必要的。

if (otherObject = null) return false;

4 ) 比較 this 與 otherObject 是否屬於同一個類。如果 equals 的語義在每個子類中有所改變,就使用 getClass 檢測:

if (getClass() != otherObject.getCIass()) return false;

如果所有的子類都擁有統一的語義,就使用 instanceof 檢測:

if (!(otherObject instanceof ClassName)) return false;

5 ) 將 otherObject 轉換爲相應的類類型變量:

ClassName other = (ClassName) otherObject

6 ) 現在開始對所有需要比較的域進行比較了。使用 ==比較基本類型域,使用 equals 比較對象域。如果所有的域都匹配, 就返回 true; 否 則 返 回 false。

return fieldl == other.field
&& Objects.equa1s(fie1d2, other.field2)

如果在子類中重新定義 equals, 就要在其中包含調用 super.equals(other)。

hashCode 方法

散列碼( hash code ) 是由對象導出的一個整型值。散列碼是沒有規律的。如果 x 和 y 是兩個不同的對象, x.hashCode( ) 與 y.hashCode( ) 基本上不會相同。
由於 hashCode方法定義在 Object 類中, 因此每個對象都有一個默認的散列碼,其值爲對象的存儲地址。
字符串 s 與 t 擁有相同的散列碼, 這是因爲字符串的散列碼是由內容導出的。而字符串緩衝 sb 與 tb卻有着不同的散列碼, 這是因爲在 StringBuffer 類中沒有定義hashCode 方法,它的散列碼是由 Object 類的默認 hashCode 方法導出的對象存儲地址。
如果重新定義 equals方法,就必須重新定義 hashCode 方法, 以便用戶可以將對象插人到散列表中
hashCode 方法應該返回一個整型數值(也可以是負數,) 併合理地組合實例域的散列碼,以便能夠讓各個不同的對象產生的散列碼更加均勻。

toString 方法

在 Object 中還有一個重要的方法, 就是 toString方法, 它用於返回表示對象值的字符串
絕大多數(但不是全部)的 toString方法都遵循這樣的格式:類的名字,隨後是一對方括號括起來的域值。
隨處可見 toString方法的主要原因是:只要對象與一個字符串通過操作符“ +” 連接起來,Java 編譯就會自動地調用 toString方法,以便獲得這個對象的字符串描述。

令人煩惱的是, 數組繼承了 object 類的 toString 方法,數組類型將按照舊的格式打印,生成字符串“ [I@la46e30” (前綴 [I 表明是一個整型數組)。修正的方式是調用靜態方法 Arrays.toString。要想打印多維數組(即, 數組的數組)則需要調用Arrays.deepToString 方法

toString方法是一種非常有用的調試工具。在標準類庫中,許多類都定義了 toString方 法, 以便用戶能夠獲得一些有關對象狀態的必要信息。強烈建議爲自定義的每一個類增加 toString 方法。這樣做不僅自己受益, 而且所有使用這個類的程序員也會從這個日誌記錄支持中受益匪淺

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章