Java中的Object類知識點歸納

2022-06-16 14:02:22
本篇文章給大家帶來了關於的相關知識,其中主要介紹了關於Object類的相關問題,包括了Object類是什麼、Object類中的equals方法、hashCode方法等等內容,下面一起來看一下,希望對大家有幫助。

推薦學習:《》

1.Object類是什麼?

Object 是 Java 類庫中的一個特殊類,也是所有類的父類別。

也就是說,Java 允許把任何型別的物件賦給 Object 型別的變數。

java裡面除了Object類,所有的類存在繼承關係的。

Object 類位於 java.lang 包中,編譯時會自動匯入, 當一個類被定義後,如果沒有指定繼承的父類別,那麼預設父類別就是 Object 類。

class Person {}
class Student {}
public class Test03 {
    public static void func(Object o) {  }

    public static void main(String[] args) {
        func(new Person());
        func(new Student());
    }
    public static void main1(String[] args) {
        Object o = new Person();
        Object o2 = new Student();
    }
}

下面來看一下Object類中都有什麼方法

本篇會簡單介紹hashCode(),equals()

2.Object類中的equals方法

下面看這樣一段程式碼

class Person {
    public String dz;
    public Person(String dz) {
        this.dz = dz;
    }
    @Override
    public String toString() {
        return "Person{" +
                "dz='" + dz + '\'' +
                '}';
    }
}
class Student {

}
public class Test03 {

    public static void main(String[] args) {
        Person person = new Person("beijing");
        Person person1 = new Person("beijing");
        System.out.println(person == person1);
}

如果直接這樣比較,看地址是否相同,就會輸出false,輸出是錯誤的

那麼如果要比較,有什麼方法嗎

在java中提供了一個方法是equals,可以用來比較兩物件是否相同

   System.out.println(person.equals(person1));

如果直接在main中這樣寫,還是會輸出false,

這是因為person裡面沒有equals,預設是繼承於Object的

可以看到裡面比較的還是this和obj,也就是當前傳進來的引數,所以才是false。

那麼如何用equals進行比較

那就要重寫一個equals才可以進行比較

    @Override
    public boolean equals(Object obj) {
        //判斷當前obj引數是否為null
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        //不是Person類物件
        if (!(obj instanceof Person)) {
            return false;
        }
        Person ret = (Person) obj;
        return this.dz.equals(ret.dz);
    }

我們可以String幫助重寫equals了

此時equals就可以比較了

比較物件中內容是否相同的時候 要重寫equals


3.Object類中的hashCode方法

使用hashCode可以計算具體的物件位置,也就是記憶體地址,然後調Integer.toHexString()方法,將這個地址以16進位制輸出

兩個dz是相同的,然後直接用hashCode計算記憶體地址,然後程式碼發現,記憶體地址是不同的

說明直接這樣中hashCode是不行的,那就要重新實現一個hashCode,

下面重寫一下hashCode,

    @Override
    public int hashCode() {
        return Objects.hash(dz);
    }

然後執行程式碼試試看,果然重寫之後,記憶體地址相同了

所以,hashCode是用來定位 位置的


4.編譯器自動生成equals和hashCode

一般重寫時,都是這兩個同時進行重寫

這就是生成好了的 equals和hashCode

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(dz, person.dz);
    }

推薦學習:《》

以上就是Java中的Object類知識點歸納的詳細內容,更多請關注TW511.COM其它相關文章!