Java基礎 第三節 第一課

我是小白呀 發表於 2020-11-27

概述

java.lang.object類是 Java 語言中的根類, 即所有類的父類. 它中描述的所有方法子類都可以使用. 在物件例項化的時候, 最終找到的父類就是 Object.

如果一個類沒有特別值定父親, 那麼預設則繼承自 Object 類. 例如:

public class MyClass /*extends Object*/ {
    // ...
}

根據 JDK 原始碼及 Object 類的 API 文件, Object 類當中包含的方法有 11 個. 今天我們主要學習其中的 2 個:

  • public String toString(): 返回該物件的字串表示
  • public boolean equals(Object obj): 指示其他某個物件是否與此物件 “相等”.

toString 方法

方法摘要

public String toString(): 返回該物件的字串表示.

toString 方法返回該物件的字串表示, 其實該字串內容就是物件的型別 + @ +記憶體地址值.

由於 toString 方法返回的結果是記憶體地址, 而在開發中, 經常需要按照物件的屬性得到相應的字串表現形式, 因此需要重寫它.

覆蓋重寫

如果不希望使用 toString 方法的預設行為, 則可以對它進行覆蓋重寫. 例如自定義 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 +
                '}';
    }
}

在 IntelliJ IDEA 中, 可以點選 Code 選單中的 Generate, 也可以使用快捷鍵 alt + insert, 點選 toString() 選項. 選擇需要包含的成員變數並確定. 如下圖所示:
在這裡插入圖片描述
注: 在我們直接使用輸出語句輸出物件名的時候, 其實通過該物件呼叫了其 toString() 方法.

equals 方法

方法摘要

public boolean equals(Object obj): 指其他某個物件是否與此物件 “相等”.

呼叫成員方法 equals 並指定引數為另一個物件, 則可以判斷這兩個物件是否是相同的. 這;裡的 “相同” 有預設和定義兩種方式.

預設地址比較

如果沒有覆蓋重寫 equals 方法, 那麼 Object 類中預設進行 == 運算子的地址比較, 只要不是同一個物件, 結果必然為 flase.

物件內容比較

如果希望進行物件的內容比較, 即所有或指定的部分成員相同就判斷兩個物件相同. 則可以覆蓋重寫 equals 方法. 例如:

import java.util.Objects;

public class Person {
    private String name;
    private int age;

    @Override
    public boolean equals(Object o) {
        // 如果物件地址一樣, 則認為相同
        if (this == o) {
            return true;
        }
        // 如果引數為空, 或者型別資訊不一樣, 則認為不同
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        // 轉換為蒼穹型別
        Person person = (Person) o;
        // 要求基本型別相等, 並且引用型別交給 java.util.Objects 類的 equals 靜態方法取用結果
        return age == person.age && Objects.equals(name, person.name);
    }
}

這段程式碼充分考慮了物件為空, 型別一致等問題, 但方法內容並不唯一. 大多數 IDE 都可以自動生成 equals 方法的程式碼內容. 在 IntelliJ IDEA 中, 可以使用 Code 選單中的 Generate 選項, 也可以使用快捷鍵 alt + insert, 並選擇 equals and hashCode() 進行自動程式碼生成. 如下圖所示:
在這裡插入圖片描述
注: Object 類當中的 hashCode 等其他方法, 今後學習.

Objects 類

在剛才 IDEA 自動重寫 equals 程式碼中, 使用到了java.util.Objects類, 那麼這個類是什麼呢?

在 JDK7 中新增了一個 Objects 工具類, 它提供了一些方法來操作物件. Objects 類由一些靜態的實用方法組成, 這些方法是 null-save (空指標安全的) 或 null-tolerant (容忍空指標的), 用於計算物件的 hashcode, 返回物件的字串表示形式, 比較兩個物件.

在比較兩個物件的時候, Objects 的 equals 方法容易丟擲空指標異常. 而 Objects 類中的 equals 方法就優化了這個問題. 方法如下:

public static boolean equals(Object a, Object b): 判斷兩個物件是否相等.

我們可以檢視一下原始碼, 學習一下:

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}