Java進階之Object類及常用方法詳解
1. Object類
Object 類是 Java 默認提供的一個類,是所有 Java 類的祖先類,每個類都使用 Object 作為父類。
那么我們就可以使用 Object 類的引用變量指向任何類的對象。在沒有明確給出一個類的父類時,Java 默認把 Object 類作為該類的父類,繼承了 Object 類的所有方法。
示例:
public class Test { public static void main(String[] args) { function(new Person()); function(new Student()); } public static void function(Object obj){ System.out.println(obj); } } class Person{ private int age; private String name; } class Student{ private int grade; private String sno; }
在上面創(chuàng)建了兩個不同類型的對象,并且作為實參傳遞給了 function 方法,此時相當于:
Object obj =new Person();
輸出的是對象引用的值,也就是其指向?qū)ο蟮牡刂贰?/p>
2. 常用的方法
Object 類中提供了一些方法,其中常用的方法有 toString()
方法,equals()
方法,hashcode()
方法等。在使用前導入 Object 類:
import java.util.Objects;
2.1 toString 方法
JDK源碼中的toString方法:
//Object類中的toString()方法實現(xiàn): public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
toString()
方法定義在 Object 類中,返回值是 String 類型,根據(jù)調(diào)用它的對象返回類名和它的引用地址。
示例:
public class Test { public static void main(String[] args) { Person person=new Person(); System.out.println(person.toString()); System.out.println(person); } } class Person{ public String name; }
在我們打印對象的引用時,實際上是默認調(diào)用了這個對象的toString
方法。返回此對象所在的類及對應的堆空間對象實體的首地址值。
該方法一般要重寫后使用,一般重寫是將類的對象的屬性返回。在沒有被重寫時,返回的字符串格式是 類名@哈希值,哈希值是十六進制的。示例:
public class Test { public static void main(String[] args) { Person person=new Person(); System.out.println(person.toString()); System.out.println(person); } } class Person{ private String name="張三"; private int age=20; public String toString(){ return "Person:name "+name+" age "+age; } } /* Person:name 張三age 20 Person:name 張三age 20 */
2.2 equals 方法
JDK 源碼中的equals()
方法:
// Object類中的equals方法 ? public boolean equals(Object obj){ ?return (this == obj); // 使用引用中的地址直接來進行比較 }
equal()
方法定義在 Object 類中,返回值是 boolean 類型,其作用是比較兩個對象在堆區(qū)的地址是否相同。示例:
public class Test { public static void main(String[] args) { Person person1=new Person("張三",18); Person person2=new Person("李四",20); boolean b=person1.equals(person2); System.out.println(b); } } class Person{ private String name; private int age; public Person(String name,int age){ this.name=name; this.age=age; } } /* false */
需要注意的是比較的是兩個引用的值是否相同,即引用執(zhí)行的地址。如果想要比較對象中的內(nèi)容,可以重寫該方法實現(xiàn)。示例:
public class Test { public static void main(String[] args) { Person person1=new Person("張三",18); Person person2=new Person("張三",18); boolean b=person1.equals(person2); System.out.println(b); } } class Person{ private String name; private int age; public Person(String name,int age){ this.name=name; this.age=age; } @Override public boolean equals(Object obj) { //判斷是否為空 if (obj == null) { return false ; } if(this == obj) { return true ; } // 不是Person類對象 if (!(obj instanceof Person)) { return false ; } Person per = (Person) obj ; // 向下轉(zhuǎn)型,比較屬性值 //此時比較時按照重寫后的equal()方法的規(guī)則 return this.name.equals(per.name) && this.age==per.age ; } } /* true */
此時,我們重寫了equals()
方法,用來比較對象中的內(nèi)容是否相同,這部分比較難,可以仔細推敲這段代碼,理解其含義。
2.3 hashcode 方法
JDK源碼中的hashcode()
方法:
public native int hashCode();
hashcode()方法定義在Object類中,用于放回對象的 hash 代碼值,確定對象在內(nèi)存中存儲的位置是否相同。
重寫該方法使用:
import java.util.Objects; public class Test { public static void main(String[] args) { Person person1=new Person("張三",18); Person person2=new Person("張三",18); System.out.println(person1.hashCode()); System.out.println(person2.hashCode()); } } class Person{ private String name; private int age; public Person(String name,int age){ this.name=name; this.age=age; } @Override public int hashCode() { return Objects.hash(name, age); } } /* 24022538 24022538 */
事實上 hashCode() 在散列表中才有用,在其它情況下沒用,在散列表中hashCode() 的作用是獲取對象的散列碼,進而確定該對象在散列表中的位置。
3. 注意事項
重寫 equals() 方法時,也必須重寫 hashcode() 方法嗎?
答:必須,hashCode 和 equals 兩個方法是用來協(xié)同判斷兩個對象是否相等的,采用這種方式的原因是可以提高程序插入和查詢的速度,當重寫equals方法后有必要將hashCode方法也重寫,這樣做才能保證不違背hashCode方法中相同對象必須有相同哈希值的約定。
== 和 equals 的區(qū)別是什么?
答:對于基本類型和引用類型 == 的作用效果是不同的,如下所示:
基本類型:比較的是值是否相同;
引用類型:比較的是引用是否相同
例如在比較兩個字符串時:
public class Test { public static void main(String[] args) { String s1=new String("HelloWorld"); String s2=new String("HelloWorld!"); String s3="HelloWorld"; System.out.println(s1.equals(s2)); System.out.println(s1.equals(s3)); } }
運行結(jié)果是
false
true
為什么會出現(xiàn)這樣的結(jié)果呢?這里就引出了一個新的概念,字符串常量值。字符串有兩種賦值方式,一種是字面值的方式賦值,另一種是 new 一個新的對象,這兩種方式在性能和內(nèi)存方面都存在差異。
當使用字面值的方式創(chuàng)建一個對象時,JVM 會在字符串常量池中尋找是否存在這個對象 "HelloWorld"
,如果不存在,則創(chuàng)建這個對象,并將這個對象的引用地址返回給字符串常量 s3,如果存在,則不創(chuàng)建對象,直接返回池中這個對象的地址。這樣我們就不難理解上面這段的代碼為什么會出現(xiàn)這樣的情況了!
4. 總結(jié)
Object 類是 Java 默認提供的一個類,是所有 Java 類的祖先類,每個類都使用Object作為父類。Object 類中提供了一些方法,這些方法為了達到想要的效果,我們一般在類中重寫使用!
到此這篇關(guān)于Java進階之Object類及常用方法詳解的文章就介紹到這了,更多相關(guān)Java Object類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
POST方法給@RequestBody傳參數(shù)失敗的解決及原因分析
這篇文章主要介紹了POST方法給@RequestBody傳參數(shù)失敗的解決及原因分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10SpringBoot ResponseBody返回值處理的實現(xiàn)
這篇文章主要介紹了SpringBoot ResponseBody返回值處理的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11在CentOS系統(tǒng)中檢測Java安裝及運行jar應用的方法
這篇文章主要介紹了在CentOS系統(tǒng)中檢測Java安裝及運行jar應用的方法,同樣適用于Fedora等其他RedHat系的Linux系統(tǒng),需要的朋友可以參考下2015-06-06MyBatis 實現(xiàn)數(shù)據(jù)的批量新增和刪除的操作
這篇文章主要介紹了MyBatis 實現(xiàn)數(shù)據(jù)的批量新增和刪除的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Mybatis如何實現(xiàn)InsertOrUpdate功能
這篇文章主要介紹了Mybatis如何實現(xiàn)InsertOrUpdate功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05