java中Object類4種方法詳細介紹

Object(四大方法):

文章幹貨滿滿,耐性看完~~
何為Object?
首先先來看看官方對Object的介紹:
在這裡附上Java官方的查閱工具:https://docs.oracle.com/en/java/javase/17/docs/api/index.html

在這裡插入圖片描述

由官方介紹可見,object屬於Java.lang包內的一個類,而且提供瞭很多種方法, Object 是類層次結構的根類。每個類都使用 Object 作為超類。所有對象(包括數組)都實現這個類的方法。簡單的說Object類就是所有類的父類,包括我們所寫的類,我們在使用類的時候就會利用Object類中的方法,之所以我們在日常學習和開發中見不到object這個類,是因為所有的父類都自動的繼承瞭這個類,並且擁有object類的所有方法,並且可以對這些方法進行重寫,達到我們的業務需求。

hashCode()方法:

hashCode()介紹:
hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實際上是返回一個int整 數。這個哈希碼的作用是
確定該對象在哈希表中的索引位置。

用法:

//新建一個HashTest類
public class HashTest {
}

//測試類
public class TestMain {
    public static void main(String[] args) {
        HashTest h = new HashTest();      
        
        int hash = h.hashCode();   //調用hashCode()方法
        System.out.println(hash);  //輸出可以得到一串整數
    }
}
//460141958
//這個數也就是哈希碼,也稱為散列碼,
//作用是確定該對象在哈希表中的索引位置

equals()方法:

參考官方文檔可知:equals(Object obj),需要傳入一個對象
所以這個方法的作用就是判斷其他對象是否“等於”此對象,返回值也就是佈爾類型。
上代碼:

public class HashTest {
}  //還是使用那個類

public class TestMain {
    public static void main(String[] args) {
        HashTest h1 = new HashTest();
        HashTest h2 = new HashTest();  //用一個類去創建兩個對象,判斷是否相等

        System.out.println(h1.equals(h2));  //語法:h1.equals(h2)
    }
}

//結果:false

到這裡,很多人就會有疑問瞭,同樣的一個類去創建兩個對象,為什麼會不一樣呢?
OK,首先我們看一下equals的源碼,看看它的判斷原理是什麼:
//equals源碼
   public boolean equals(Object obj) {
        return (this == obj);
    }
源碼很簡單,不就是兩個==號,但是我們知道類的引用類型的數據,而用兩個等於號去判斷兩個引用類型,是去判斷兩者的內存地址是否相同,當一個類去new一個新對象時,是在堆內存內開辟瞭一個新的空間,當去創建兩個或者多個類的時候,每個類肯定有屬於自己的空間,所有也有一個獨一無二的地址,這就是為什麼這個判斷為什麼不成立的原因。
但是比較對象的引用對於我們在實際開發中沒有意義,我們一般還是要重寫該方法,比如去判斷兩者的參數是否相等:
public class HashTest {

    private int age;

    public HashTest() {
    }

    public HashTest(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

//重寫equals方法,隻要HashTest生成的對象,傳入age參數相等,即可判斷兩者一致
//重寫後的equals,就不在是去判斷兩者的地址是否相同 
    @Override
    public boolean equals(Object obj){
        HashTest h = (HashTest) obj;    //多態
        if(this.age == h.getAge()) {
            return true;
        }
        return false;
    }
}

//測試類:
public class TestMain {
    public static void main(String[] args) {
        HashTest h1 = new HashTest(5);
        HashTest h2 = new HashTest(5);

        System.out.println(h1.equals(h2));
    }
}

//結果:true

//若吧其中一個age改成6:
public class TestMain {
    public static void main(String[] args) {
        HashTest h1 = new HashTest(5);
        HashTest h2 = new HashTest(6);

        System.out.println(h1.equals(h2));
    }
}
//結果:flase

== 和 equals 的區別是什麼?

== : 它的作用是判斷兩個對象的地址是不是相等。即,判斷兩個對象是不是同 一個對象。
(基本數據類型== 比較的是值,引用數據類型 == 比較的是內存地址)

equals() : 它的作用也是判斷兩個對象是否相等。但它一般有兩種使用情況:
情況1:類沒有重寫equals() 方法。則通過 equals() 比較該類的兩個對象時, 等價於通過“==”比較這兩個對象。
情況2:類重寫瞭 equals() 方法。一般,我們都覆蓋 equals() 方法來兩個對象 的內容相等;若它們的內
容相等,則返回 true (即,認為這兩個對象相等)

hashCode()與equals()的相關規定:

如果兩個對象相等,則hashcode一定也是相同的 兩個對象相等,對兩個對象分別調用equals方法都返
回true, 兩個對象有相同的hashcode值,它們也不一定是相等的。因此,equals 方法被重寫過,則 hashCode 方法也必須被重寫,hashCode() 的默認行為是對堆上的對象產生獨特值。如果沒有重寫hashCode(),則該 class 的兩個對象無論如何都不會相等(即使這兩個對象指 向相同的數據)

getClass()方法:

返回此 Object 運行時的類,,獲取對象的真實類的全名稱
比如在使用多態時,父類引用變量,使用getClass()方法就可以看到真實的類:

public class HashTest {
}

//測試類
public class TestMain {
    public static void main(String[] args) {
        HashTest h1 = new HashTest();

        System.out.println(h1.getClass());  //調用getClass()
    }
}

輸出值:class HashTest
這個就比較好理解,簡單的說就是看當時使用該方法的對象,到底是哪個類。
還有一個應用場景,在使用多態的時候,在代碼多的時候我們做不到用肉眼去找這個多態是用哪子類,即使找得到,也很浪費時間,那麼getClass()方法就派上用場瞭:
//在polymorphismTest包下創建瞭Person類,作為父類
package polymorphismTest;
public class Person {
    public void eat(){
        System.out.println("我會吃飯");
    }
}


//創建Student類,繼承Person
package polymorphismTest;
public class Student extends Person{

    @Override    //重寫父類eat方法
    public void eat(){
        System.out.println("我是學生,我也還吃飯");
    }
}


//測試類
package polymorphismTest;
public class TestMain {
    public static void main(String[] args) {

        Person p = new Student();    //使用多態
        p.eat();                     //這裡其實就是使用瞭Student子類的方法
        System.out.println(p.getClass());  //查看p到底是什麼類
    }
}

//輸出結果:
//我是學生,我也還吃飯
//class polymorphismTest.Student

用父類去引用子類的方法時,可以執行子類的方法,當用getClass()方法去查看,結果也是Student子類
不使用多態,使用類本身去創建對象時:
package polymorphismTest;

public class TestMain {
    public static void main(String[] args) {
    
        Person p = new Person();  //當這裡不使用多態,而是使用本身的時候
        p.eat();
        System.out.println(p.getClass());
    }
}

//我會吃飯
//class polymorphismTest.Person
//這裡返回的就是Person類瞭

toString()方法:

返回一個字符串來標識當前對象
對於這個方法,我們先來看看toString()源碼:

 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
其實也很簡,就是 類名+符號@+對象的哈希碼值
public class TestMain {
    public static void main(String[] args) {

        Person p = new Person();
        System.out.println(p.toString());
    }
}
//結果:polymorphismTest.Person@1b6d3586
但是這個返回值視乎沒什麼意義,所以,為瞭返回值有更多的意義,我們可以重寫這個方法

總結

到此這篇關於java中Object類4種方法詳細介紹的文章就介紹到這瞭,更多相關java Object類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: