Java進(jìn)階之Object類(lèi)及常用方法詳解
1. Object類(lèi)
Object 類(lèi)是 Java 默認(rèn)提供的一個(gè)類(lèi),是所有 Java 類(lèi)的祖先類(lèi),每個(gè)類(lèi)都使用 Object 作為父類(lèi)。

那么我們就可以使用 Object 類(lèi)的引用變量指向任何類(lèi)的對(duì)象。在沒(méi)有明確給出一個(gè)類(lèi)的父類(lèi)時(shí),Java 默認(rèn)把 Object 類(lèi)作為該類(lèi)的父類(lèi),繼承了 Object 類(lèi)的所有方法。
示例:
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)建了兩個(gè)不同類(lèi)型的對(duì)象,并且作為實(shí)參傳遞給了 function 方法,此時(shí)相當(dāng)于:
Object obj =new Person();
輸出的是對(duì)象引用的值,也就是其指向?qū)ο蟮牡刂贰?/p>
2. 常用的方法
Object 類(lèi)中提供了一些方法,其中常用的方法有 toString() 方法,equals() 方法,hashcode() 方法等。在使用前導(dǎo)入 Object 類(lèi):
import java.util.Objects;
2.1 toString 方法
JDK源碼中的toString方法:
//Object類(lèi)中的toString()方法實(shí)現(xiàn):
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
toString() 方法定義在 Object 類(lèi)中,返回值是 String 類(lèi)型,根據(jù)調(diào)用它的對(duì)象返回類(lèi)名和它的引用地址。
示例:
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;
}
在我們打印對(duì)象的引用時(shí),實(shí)際上是默認(rèn)調(diào)用了這個(gè)對(duì)象的toString方法。返回此對(duì)象所在的類(lèi)及對(duì)應(yīng)的堆空間對(duì)象實(shí)體的首地址值。
該方法一般要重寫(xiě)后使用,一般重寫(xiě)是將類(lèi)的對(duì)象的屬性返回。在沒(méi)有被重寫(xiě)時(shí),返回的字符串格式是 類(lèi)名@哈希值,哈希值是十六進(jìn)制的。示例:
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類(lèi)中的equals方法
?
public boolean equals(Object obj){
?return (this == obj);
// 使用引用中的地址直接來(lái)進(jìn)行比較
}
equal()方法定義在 Object 類(lèi)中,返回值是 boolean 類(lèi)型,其作用是比較兩個(gè)對(duì)象在堆區(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
*/
需要注意的是比較的是兩個(gè)引用的值是否相同,即引用執(zhí)行的地址。如果想要比較對(duì)象中的內(nèi)容,可以重寫(xiě)該方法實(shí)現(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類(lèi)對(duì)象
if (!(obj instanceof Person)) {
return false ;
}
Person per = (Person) obj ; // 向下轉(zhuǎn)型,比較屬性值
//此時(shí)比較時(shí)按照重寫(xiě)后的equal()方法的規(guī)則
return this.name.equals(per.name) && this.age==per.age ;
}
}
/*
true
*/
此時(shí),我們重寫(xiě)了equals()方法,用來(lái)比較對(duì)象中的內(nèi)容是否相同,這部分比較難,可以仔細(xì)推敲這段代碼,理解其含義。
2.3 hashcode 方法
JDK源碼中的hashcode()方法:
public native int hashCode();
hashcode()方法定義在Object類(lèi)中,用于放回對(duì)象的 hash 代碼值,確定對(duì)象在內(nèi)存中存儲(chǔ)的位置是否相同。
重寫(xiě)該方法使用:
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
*/
事實(shí)上 hashCode() 在散列表中才有用,在其它情況下沒(méi)用,在散列表中hashCode() 的作用是獲取對(duì)象的散列碼,進(jìn)而確定該對(duì)象在散列表中的位置。
3. 注意事項(xiàng)
重寫(xiě) equals() 方法時(shí),也必須重寫(xiě) hashcode() 方法嗎?
答:必須,hashCode 和 equals 兩個(gè)方法是用來(lái)協(xié)同判斷兩個(gè)對(duì)象是否相等的,采用這種方式的原因是可以提高程序插入和查詢的速度,當(dāng)重寫(xiě)equals方法后有必要將hashCode方法也重寫(xiě),這樣做才能保證不違背hashCode方法中相同對(duì)象必須有相同哈希值的約定。
== 和 equals 的區(qū)別是什么?
答:對(duì)于基本類(lèi)型和引用類(lèi)型 == 的作用效果是不同的,如下所示:
基本類(lèi)型:比較的是值是否相同;
引用類(lèi)型:比較的是引用是否相同
例如在比較兩個(gè)字符串時(shí):
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));
}
}
運(yùn)行結(jié)果是
false
true
為什么會(huì)出現(xiàn)這樣的結(jié)果呢?這里就引出了一個(gè)新的概念,字符串常量值。字符串有兩種賦值方式,一種是字面值的方式賦值,另一種是 new 一個(gè)新的對(duì)象,這兩種方式在性能和內(nèi)存方面都存在差異。
當(dāng)使用字面值的方式創(chuàng)建一個(gè)對(duì)象時(shí),JVM 會(huì)在字符串常量池中尋找是否存在這個(gè)對(duì)象 "HelloWorld",如果不存在,則創(chuàng)建這個(gè)對(duì)象,并將這個(gè)對(duì)象的引用地址返回給字符串常量 s3,如果存在,則不創(chuàng)建對(duì)象,直接返回池中這個(gè)對(duì)象的地址。這樣我們就不難理解上面這段的代碼為什么會(huì)出現(xiàn)這樣的情況了!
4. 總結(jié)
Object 類(lèi)是 Java 默認(rèn)提供的一個(gè)類(lèi),是所有 Java 類(lèi)的祖先類(lèi),每個(gè)類(lèi)都使用Object作為父類(lèi)。Object 類(lèi)中提供了一些方法,這些方法為了達(dá)到想要的效果,我們一般在類(lèi)中重寫(xiě)使用!
到此這篇關(guān)于Java進(jìn)階之Object類(lèi)及常用方法詳解的文章就介紹到這了,更多相關(guān)Java Object類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
POST方法給@RequestBody傳參數(shù)失敗的解決及原因分析
這篇文章主要介紹了POST方法給@RequestBody傳參數(shù)失敗的解決及原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java線程之守護(hù)線程(Daemon)用法實(shí)例
這篇文章主要介紹了Java線程之守護(hù)線程(Daemon)用法,較為詳細(xì)的分析了守護(hù)線程的功能與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
SpringBoot ResponseBody返回值處理的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot ResponseBody返回值處理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java 實(shí)現(xiàn)一個(gè)漢諾塔實(shí)戰(zhàn)練習(xí)
漢諾塔是源于印度一個(gè)古老傳說(shuō)的益智玩具。大梵天創(chuàng)造世界時(shí)做了三根石柱,在一根柱子上從下往上按大小順序摞著64片黃金圓盤(pán)。大梵天命令婆羅門(mén)把圓盤(pán)從下面開(kāi)始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤(pán)上不能放大圓盤(pán),三根柱子之間一次只能移動(dòng)一個(gè)圓盤(pán)2021-10-10
在CentOS系統(tǒng)中檢測(cè)Java安裝及運(yùn)行jar應(yīng)用的方法
這篇文章主要介紹了在CentOS系統(tǒng)中檢測(cè)Java安裝及運(yùn)行jar應(yīng)用的方法,同樣適用于Fedora等其他RedHat系的Linux系統(tǒng),需要的朋友可以參考下2015-06-06
IDEA卡在”正在解析Maven依賴項(xiàng)“的解決方法
在創(chuàng)建新的SpringBoot項(xiàng)目時(shí),始終卡在"正在解析Maven依賴項(xiàng)…",本文小編給大家介紹了幾種相關(guān)的解決方案,具有一定的參考價(jià)值,需要的朋友可以參考下2023-11-11
MyBatis 實(shí)現(xiàn)數(shù)據(jù)的批量新增和刪除的操作
這篇文章主要介紹了MyBatis 實(shí)現(xiàn)數(shù)據(jù)的批量新增和刪除的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Mybatis中使用updateBatch進(jìn)行批量更新
這篇文章主要介紹了Mybatis中使用updateBatch進(jìn)行批量更新的相關(guān)資料,有逐條更新,sql批量更新等,具體實(shí)例代碼大家參考下本文2018-04-04
Mybatis如何實(shí)現(xiàn)InsertOrUpdate功能
這篇文章主要介紹了Mybatis如何實(shí)現(xiàn)InsertOrUpdate功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05

