1. 程式人生 > 實用技巧 >Java之 Object類

Java之 Object類

0x01. Object類

Object類的概述

  • java.lang.Object類是Java語言中的根類,即所有類的父類。

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

    public class MyClass /*extends Object*/ {
      	// ...
    }
    
  • 根據JDK原始碼及Object類的API文件,Object類當中包含的方法有11個。今天我們主要學習其中的2個:

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

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

1、toString方法

需學會的知識點:

  • toString方法的概述
  • 重寫toString方法

toString方法的概述

  • public String toString():返回該物件的字串表示,其實該字串內容就是:物件的型別名+@+記憶體地址值。

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

重寫toString方法

如果不希望使用toString方法的預設行為,則可以對它進行覆蓋重寫。例如自定義的Person類:

public class Person {  
    private String name;
    private int age;
	
    // alt + insert -> toString() 回車
    @Override
    public String toString() {
        return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
    }

    // 省略構造器與Getter Setter
}

在IntelliJ IDEA中,可以點選Code選單中的Generate...,也可以使用快捷鍵alt+insert,點選toString()選項。選擇需要包含的成員變數並確定。

小貼士: 在我們直接使用輸出語句輸出物件名的時候,其實通過該物件呼叫了其toString()方法。

小結

  • toString方法預設返回的字串內容格式: 物件的型別+@+十六進位制數的地址值
  • 列印物件的時候,其實就是列印該物件呼叫toString方法返回的字串內容
  • 如果列印物件的時候不希望列印的是地址值的形式,那麼就可以去重寫toString方法,指定返回的字串內容格式 ---->一般開發中,重寫toString方法---alt+insert--->toString() 回車

2、equals方法

equals方法的概述

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

#### equals方法的使用

預設地址比較

Object類的equals()方法預設是==比較,也就是比較2個物件的地址值,對於我們來說沒有用

物件內容比較

如果希望進行物件的內容比較,即所有或指定的部分成員變數相同就判定兩個物件相同,則可以覆蓋重寫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()進行自動程式碼生成。

tips:Object類當中的hashCode等其他方法,今後學習。

小結

  • 概述: equals方法可以判斷兩個物件是否相同

  • 1.Object類的equals方法預設比較的是2個物件的地址值是否相同  ==一樣的效果
    2.如果在開發中,希望呼叫equals方法比較的不是2個物件的地址值,那麼就需要重寫equals方法,指定比較規則
      一般開發中,重寫toString方法,使用idea的快捷鍵alt+insert--->equals and hashCode 回車
    

3、Objects類

  • Objects類的概述
  • Objects類中的equals方法的使用

講解:

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

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

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

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

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

 public static boolean equals(Object a, Object b) {
       // 如果比較的2個物件的地址值相同,就直接返回true
       // 如果2個物件的地址值不同:
       //     如果第一個物件a等於null,就直接返回false
       //     只有第一個物件a不等於null,才會執行a.equals(b)比較這2個物件是否相等
        return (a == b) || (a != null && a.equals(b));
 }