Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
686
2022-05-30
Object 類
概述
toString 方法
方法摘要
覆蓋重寫
equals 方法
方法摘要
默認(rèn)地址比較
對象內(nèi)容比較
Objects 類
概述
java.lang.object類是 Java 語言中的根類, 即所有類的父類. 它中描述的所有方法子類都可以使用. 在對象實(shí)例化的時候, 最終找到的父類就是 Object.
如果一個類沒有特別值定父親, 那么默認(rèn)則繼承自 Object 類. 例如:
public class MyClass /*extends Object*/ { // ... }
1
2
3
根據(jù) JDK 源代碼及 Object 類的 API 文檔, Object 類當(dāng)中包含的方法有 11 個. 今天我們主要學(xué)習(xí)其中的 2 個:
public String toString(): 返回該對象的字符串表示
public boolean equals(Object obj): 指示其他某個對象是否與此對象 “相等”.
toString 方法
方法摘要
public String toString(): 返回該對象的字符串表示.
toString 方法返回該對象的字符串表示, 其實(shí)該字符串內(nèi)容就是對象的類型 + @ +內(nèi)存地址值.
由于 toString 方法返回的結(jié)果是內(nèi)存地址, 而在開發(fā)中, 經(jīng)常需要按照對象的屬性得到相應(yīng)的字符串表現(xiàn)形式, 因此需要重寫它.
覆蓋重寫
如果不希望使用 toString 方法的默認(rèn)行為, 則可以對它進(jìn)行覆蓋重寫. 例如自定義 Person 類:
public class Person { private String name; private int age; // get/set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } // 覆蓋重寫toString方法 @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
在 IntelliJ IDEA 中, 可以點(diǎn)擊 Code 菜單中的 Generate, 也可以使用快捷鍵 alt + insert, 點(diǎn)擊 toString() 選項. 選擇需要包含的成員變量并確定. 如下圖所示:
注: 在我們直接使用輸出語句輸出對象名的時候, 其實(shí)通過該對象調(diào)用了其 toString() 方法.
equals 方法
方法摘要
public boolean equals(Object obj): 指其他某個對象是否與此對象 “相等”.
調(diào)用成員方法 equals 并指定參數(shù)為另一個對象, 則可以判斷這兩個對象是否是相同的. 這;里的 “相同” 有默認(rèn)和定義兩種方式.
默認(rèn)地址比較
如果沒有覆蓋重寫 equals 方法, 那么 Object 類中默認(rèn)進(jìn)行 == 運(yùn)算符的地址比較, 只要不是同一個對象, 結(jié)果必然為 flase.
對象內(nèi)容比較
如果希望進(jìn)行對象的內(nèi)容比較, 即所有或指定的部分成員相同就判斷兩個對象相同. 則可以覆蓋重寫 equals 方法. 例如:
import java.util.Objects; public class Person { private String name; private int age; @Override public boolean equals(Object o) { // 如果對象地址一樣, 則認(rèn)為相同 if (this == o) { return true; } // 如果參數(shù)為空, 或者類型信息不一樣, 則認(rèn)為不同 if (o == null || getClass() != o.getClass()) { return false; } // 轉(zhuǎn)換為蒼穹類型 Person person = (Person) o; // 要求基本類型相等, 并且引用類型交給 java.util.Objects 類的 equals 靜態(tài)方法取用結(jié)果 return age == person.age && Objects.equals(name, person.name); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
這段代碼充分考慮了對象為空, 類型一致等問題, 但方法內(nèi)容并不唯一. 大多數(shù) IDE 都可以自動生成 equals 方法的代碼內(nèi)容. 在 IntelliJ IDEA 中, 可以使用 Code 菜單中的 Generate 選項, 也可以使用快捷鍵 alt + insert, 并選擇 equals and hashCode() 進(jìn)行自動代碼生成. 如下圖所示:
注: Object 類當(dāng)中的 hashCode 等其他方法, 今后學(xué)習(xí).
Objects 類
在剛才 IDEA 自動重寫 equals 代碼中, 使用到了java.util.Objects類, 那么這個類是什么呢?
在 JDK7 中添加了一個 Objects 工具類, 它提供了一些方法來操作對象. Objects 類由一些靜態(tài)的實(shí)用方法組成, 這些方法是 null-save (空指針安全的) 或 null-tolerant (容忍空指針的), 用于計算對象的 hashcode, 返回對象的字符串表示形式, 比較兩個對象.
在比較兩個對象的時候, Objects 的 equals 方法容易拋出空指針異常. 而 Objects 類中的 equals 方法就優(yōu)化了這個問題. 方法如下:
public static boolean equals(Object a, Object b): 判斷兩個對象是否相等.
我們可以查看一下源碼, 學(xué)習(xí)一下:
public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); }
1
2
3
IDE Java
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。