Java中的Object類詳細解讀
什么是Object類?
類 java.lang.Object是類層次結(jié)構(gòu)的根類,即所有其它類的父類。
每個類都使用 Object 作為超類。(父類和超類是一個意思,不同的叫法) 也就是當初的Java語言設計時,就將Object作為所有類的父類, 是萬類之父。
①Object類型的變量與除Object以外的任意引用數(shù)據(jù)類型的對象都存在多態(tài)引用。
method(Object obj){…} //可以接收任何類作為其參數(shù)
Person o = new Person();
method(o);
②所有對象(包括數(shù)組)都實現(xiàn)這個類的方法。
③如果一個類沒有特別指定父類,那么默認則繼承自Object類。
public class Person {
...
}
//等價于:
public class Person extends Object {
...
}
Object類的相關方法
- equals()
- = =:
基本類型比較值:只要兩個變量的值相等,即為true。
int a=5;
if(a==6){…}
引用類型比較引用(是否指向同一個對象):只有指向同一個對象時,==才返回true。
Person p1=new Person();
Person p2=new Person();
if (p1==p2){…}
用“==”進行比較時,符號兩邊的數(shù)據(jù)類型必須兼容(可自動轉(zhuǎn)換的基本數(shù)據(jù)類型除外),否則編譯出錯
equals()
所有類都繼承了Object,也就獲得了equals()方法。還可以重寫。
- 只能比較引用類型,Object類源碼中equals()的作用與“==”相同:比較是否指向同一個對象。
- 特例:當用equals()方法進行比較時,對類File、String、Date及包裝類(Wrapper Class)來說,是比較類型及內(nèi)容而不考慮引用的是否是同一個對象;
- 原因:在這些類中重寫了Object類的equals()方法。
- 當自定義使用equals()時,可以重寫。用于比較兩個對象的“內(nèi)容”是否都相等。
經(jīng)典面試題:==和equals的區(qū)別?
- == 既可以比較基本類型也可以比較引用類型。對于基本類型就是比較值,對于引用類型就是比較內(nèi)存地址
- equals的話,它是屬于java.lang.Object類里面的方法,如果該方法沒有被重寫過默認也是==;我們可以看到String等類的equals方法是被重寫過的,而且String類在日常開發(fā)中用的比較多,久而久之,形成了equals是比較值的錯誤觀點。
- 具體要看自定義類里有沒有重寫Object的equals方法來判斷。
- 通常情況下,重寫equals方法,會比較類中的相應屬性是否都相等。
toString()
方法聲明:public String toString()
① 默認情況下,toString()返回的是“對象的運行時類型 @ 對象的hashCode值的十六進制形式"
② 在進行String與其它類型數(shù)據(jù)的連接操作時,自動調(diào)用toString()方法
Date now=new Date(); System.out.println(“now=”+now); //相當于 System.out.println(“now=”+now.toString());
③ 如果我們直接System.out.println(對象),默認會自動調(diào)用這個對象的toString()
因為Java的引用數(shù)據(jù)類型的變量中存儲的實際上是對象的內(nèi)存地址,但是Java對程序員隱藏內(nèi)存地址信息,所以不能直接將內(nèi)存地址顯示出來,所以當你打印對象時,JVM幫你調(diào)用了對象的toString()。
④ 可以根據(jù)需要在用戶自定義類型中重寫toString()方法 如String 類重寫了toString()方法,返回字符串的值。
s1="hello"; System.out.println(s1);//相當于System.out.println(s1.toString());
例如自定義的Person類:
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
finalize()
- 當對象被回收時,系統(tǒng)自動調(diào)用該對象的 finalize() 方法。(不是垃圾回收器調(diào)用的,是本類對象調(diào)用的)
- 永遠不要主動調(diào)用某個對象的finalize方法,應該交給垃圾回收機制調(diào)用。
- 什么時候被回收:當某個對象沒有任何引用時,JVM就認為這個對象是垃圾對象,就會在之后不確定的時間使用垃圾回收機制來銷毀該對象,在銷毀該對象前,會先調(diào)用 finalize()方法。
- 子類可以重寫該方法,目的是在對象被清理之前執(zhí)行必要的清理操作。比如,在方法內(nèi)斷開相關連接資源。
- 如果重寫該方法,讓一個新的引用變量重新引用該對象,則會重新激活對象。
- 在JDK 9中此方法已經(jīng)被標記為過時的。
public class FinalizeTest {
public static void main(String[] args) {
Person p = new Person("Peter", 12);
System.out.println(p);
p = null;//此時對象實體就是垃圾對象,等待被回收。但時間不確定。
System.gc();//強制性釋放空間
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//子類重寫此方法,可在釋放對象前進行某些操作
@Override
protected void finalize() throws Throwable {
System.out.println("對象被釋放--->" + this);
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
getClass()
public final Class<?> getClass():獲取對象的運行時類型
因為Java有多態(tài)現(xiàn)象,所以一個引用數(shù)據(jù)類型的變量的編譯時類型與運行時類型可能不一致,因此如果需要查看這個變量實際指向的對象的類型,需要用getClass()方法
public static void main(String[] args) {
Object obj = new Person();
System.out.println(obj.getClass());//運行時類型
}
結(jié)果:
class com.atguigu.java.Person
到此這篇關于Java中的Object類詳細解讀的文章就介紹到這了,更多相關Java中的Object類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java實現(xiàn)調(diào)用對方http接口得到返回數(shù)據(jù)
這篇文章主要介紹了Java實現(xiàn)調(diào)用對方http接口得到返回數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
IntelliJ IDEA 中使用jRebel進行 Java 熱部署教程圖解
Rebel是一款JAVA虛擬機插件,它使得JAVA程序員能在不進行重部署的情況下,即時看到代碼的改變對一個應用程序帶來的影響。本文通過圖文并茂的形式給大家介紹了IntelliJ IDEA 中使用jRebel進行 Java 熱部署教程圖解,需要的朋友參考下吧2018-04-04
Java實現(xiàn)一鍵將Word文檔轉(zhuǎn)為PDF
在開發(fā)中,經(jīng)常會碰到需要把 Word 文檔轉(zhuǎn)換成 PDF 格式的需求,Java 有不少好用的庫能實現(xiàn)這個功能,本文為大家介紹了兩個常用的方法,需要的可以了解下2025-02-02
SpringBoot項目中訪問HTML頁面的實現(xiàn)示例
本文主要介紹了SpringBoot項目中訪問HTML頁面的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-08-08
java中File轉(zhuǎn)為MultipartFile的四種實現(xiàn)方式
這篇文章主要介紹了java中File轉(zhuǎn)為MultipartFile的四種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
java輸入時如何通過回車(enter)來結(jié)束輸入
這篇文章主要介紹了java輸入時如何通過回車(enter)來結(jié)束輸入,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05

