java中Object類4種方法詳細(xì)介紹
Object(四大方法):
文章干貨滿滿,耐性看完~~
何為Object?
首先先來看看官方對Object的介紹:
在這里附上Java官方的查閱工具:https://docs.oracle.com/en/java/javase/17/docs/api/index.html
由官方介紹可見,object屬于Java.lang包內(nèi)的一個(gè)類,而且提供了很多種方法, Object 是類層次結(jié)構(gòu)的根類。每個(gè)類都使用 Object 作為超類。所有對象(包括數(shù)組)都實(shí)現(xiàn)這個(gè)類的方法。簡單的說Object類就是所有類的父類,包括我們所寫的類,我們在使用類的時(shí)候就會利用Object類中的方法,之所以我們在日常學(xué)習(xí)和開發(fā)中見不到object這個(gè)類,是因?yàn)樗械母割惗甲詣拥睦^承了這個(gè)類,并且擁有object類的所有方法,并且可以對這些方法進(jìn)行重寫,達(dá)到我們的業(yè)務(wù)需求。
hashCode()方法:
hashCode()介紹:
hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實(shí)際上是返回一個(gè)int整 數(shù)。這個(gè)哈希碼的作用是
確定該對象在哈希表中的索引位置。
用法:
//新建一個(gè)HashTest類 public class HashTest { } //測試類 public class TestMain { public static void main(String[] args) { HashTest h = new HashTest(); int hash = h.hashCode(); //調(diào)用hashCode()方法 System.out.println(hash); //輸出可以得到一串整數(shù) } } //460141958 //這個(gè)數(shù)也就是哈希碼,也稱為散列碼, //作用是確定該對象在哈希表中的索引位置
equals()方法:
參考官方文檔可知:equals(Object obj),需要傳入一個(gè)對象
所以這個(gè)方法的作用就是判斷其他對象是否“等于”此對象,返回值也就是布爾類型。
上代碼:
public class HashTest { } //還是使用那個(gè)類 public class TestMain { public static void main(String[] args) { HashTest h1 = new HashTest(); HashTest h2 = new HashTest(); //用一個(gè)類去創(chuàng)建兩個(gè)對象,判斷是否相等 System.out.println(h1.equals(h2)); //語法:h1.equals(h2) } } //結(jié)果:false
到這里,很多人就會有疑問了,同樣的一個(gè)類去創(chuàng)建兩個(gè)對象,為什么會不一樣呢? OK,首先我們看一下equals的源碼,看看它的判斷原理是什么:
//equals源碼 public boolean equals(Object obj) { return (this == obj); }
源碼很簡單,不就是兩個(gè)==號,但是我們知道類的引用類型的數(shù)據(jù),而用兩個(gè)等于號去判斷兩個(gè)引用類型,是去判斷兩者的內(nèi)存地址是否相同,當(dāng)一個(gè)類去new一個(gè)新對象時(shí),是在堆內(nèi)存內(nèi)開辟了一個(gè)新的空間,當(dāng)去創(chuàng)建兩個(gè)或者多個(gè)類的時(shí)候,每個(gè)類肯定有屬于自己的空間,所有也有一個(gè)獨(dú)一無二的地址,這就是為什么這個(gè)判斷為什么不成立的原因。 但是比較對象的引用對于我們在實(shí)際開發(fā)中沒有意義,我們一般還是要重寫該方法,比如去判斷兩者的參數(shù)是否相等:
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參數(shù)相等,即可判斷兩者一致 //重寫后的equals,就不在是去判斷兩者的地址是否相同 @Override public boolean equals(Object obj){ HashTest h = (HashTest) obj; //多態(tài) 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)); } } //結(jié)果:true //若吧其中一個(gè)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)); } } //結(jié)果:flase
== 和 equals 的區(qū)別是什么?
== : 它的作用是判斷兩個(gè)對象的地址是不是相等。即,判斷兩個(gè)對象是不是同 一個(gè)對象。
(基本數(shù)據(jù)類型== 比較的是值,引用數(shù)據(jù)類型 == 比較的是內(nèi)存地址)
equals() : 它的作用也是判斷兩個(gè)對象是否相等。但它一般有兩種使用情況:
情況1:類沒有重寫equals() 方法。則通過 equals() 比較該類的兩個(gè)對象時(shí), 等價(jià)于通過“==”比較這兩個(gè)對象。
情況2:類重寫了 equals() 方法。一般,我們都覆蓋 equals() 方法來兩個(gè)對象 的內(nèi)容相等;若它們的內(nèi)
容相等,則返回 true (即,認(rèn)為這兩個(gè)對象相等)
hashCode()與equals()的相關(guān)規(guī)定:
如果兩個(gè)對象相等,則hashcode一定也是相同的 兩個(gè)對象相等,對兩個(gè)對象分別調(diào)用equals方法都返
回true, 兩個(gè)對象有相同的hashcode值,它們也不一定是相等的。因此,equals 方法被重寫過,則 hashCode 方法也必須被重寫,hashCode() 的默認(rèn)行為是對堆上的對象產(chǎn)生獨(dú)特值。如果沒有重寫hashCode(),則該 class 的兩個(gè)對象無論如何都不會相等(即使這兩個(gè)對象指 向相同的數(shù)據(jù))
getClass()方法:
返回此 Object 運(yùn)行時(shí)的類,,獲取對象的真實(shí)類的全名稱
比如在使用多態(tài)時(shí),父類引用變量,使用getClass()方法就可以看到真實(shí)的類:
public class HashTest { } //測試類 public class TestMain { public static void main(String[] args) { HashTest h1 = new HashTest(); System.out.println(h1.getClass()); //調(diào)用getClass() } } 輸出值:class HashTest
這個(gè)就比較好理解,簡單的說就是看當(dāng)時(shí)使用該方法的對象,到底是哪個(gè)類。 還有一個(gè)應(yīng)用場景,在使用多態(tài)的時(shí)候,在代碼多的時(shí)候我們做不到用肉眼去找這個(gè)多態(tài)是用哪子類,即使找得到,也很浪費(fèi)時(shí)間,那么getClass()方法就派上用場了:
//在polymorphismTest包下創(chuàng)建了Person類,作為父類 package polymorphismTest; public class Person { public void eat(){ System.out.println("我會吃飯"); } } //創(chuàng)建Student類,繼承Person package polymorphismTest; public class Student extends Person{ @Override //重寫父類eat方法 public void eat(){ System.out.println("我是學(xué)生,我也還吃飯"); } } //測試類 package polymorphismTest; public class TestMain { public static void main(String[] args) { Person p = new Student(); //使用多態(tài) p.eat(); //這里其實(shí)就是使用了Student子類的方法 System.out.println(p.getClass()); //查看p到底是什么類 } } //輸出結(jié)果: //我是學(xué)生,我也還吃飯 //class polymorphismTest.Student
用父類去引用子類的方法時(shí),可以執(zhí)行子類的方法,當(dāng)用getClass()方法去查看,結(jié)果也是Student子類 不使用多態(tài),使用類本身去創(chuàng)建對象時(shí):
package polymorphismTest; public class TestMain { public static void main(String[] args) { Person p = new Person(); //當(dāng)這里不使用多態(tài),而是使用本身的時(shí)候 p.eat(); System.out.println(p.getClass()); } } //我會吃飯 //class polymorphismTest.Person //這里返回的就是Person類了
toString()方法:
返回一個(gè)字符串來標(biāo)識當(dāng)前對象
對于這個(gè)方法,我們先來看看toString()源碼:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
其實(shí)也很簡,就是 類名+符號@+對象的哈希碼值
public class TestMain { public static void main(String[] args) { Person p = new Person(); System.out.println(p.toString()); } } //結(jié)果:polymorphismTest.Person@1b6d3586
但是這個(gè)返回值視乎沒什么意義,所以,為了返回值有更多的意義,我們可以重寫這個(gè)方法
總結(jié)
到此這篇關(guān)于java中Object類4種方法詳細(xì)介紹的文章就介紹到這了,更多相關(guān)java Object類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Log4j為項(xiàng)目配置日志輸出應(yīng)用詳解以及示例演示的實(shí)現(xiàn)分析
本篇文章是對Log4j為項(xiàng)目配置日志輸出應(yīng)用詳解以及示例演示的實(shí)現(xiàn)進(jìn)行了分析介紹,需要的朋友參考下2013-05-05idea中使用Inputstream流導(dǎo)致中文亂碼解決方法
很多朋友遇到一個(gè)措手不及的問題當(dāng)idea中使用Inputstream流導(dǎo)致中文亂碼及Java FileInputStream讀中文亂碼問題,針對這兩個(gè)問題很多朋友不知道該如何解決,下面小編把解決方案分享給大家供大家參考2021-05-05Spring Cloud中各組件超時(shí)總結(jié)
在大家學(xué)習(xí)spring cloud的時(shí)候組件是必不可少的一部分,下面這篇文章主要給大家介紹了關(guān)于Spring Cloud中各組件超時(shí)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11深入了解SpringBoot中的統(tǒng)一返回和統(tǒng)一異常處理
這篇文章主要為大家詳細(xì)介紹了SpringBoot項(xiàng)目中常用的統(tǒng)一返回結(jié)果和統(tǒng)一異常處理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2024-01-01