溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中Class和Object是什么意思

發(fā)布時間:2022-01-14 14:18:44 來源:億速云 閱讀:415 作者:小新 欄目:大數(shù)據(jù)

這篇文章給大家分享的是有關Java中Class和Object是什么意思的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。



剛開始學的時候,老師對我們說的第一句話就是在Java的世界里一切都是對象。那么這個對象是什么呢?就是在java.lang包下面的Object對象。Object是一個具體的類,它的設計主要是為了擴展。在JDK中對于Object的描述如下:

Java中Class和Object是什么意思


它的意思是Object在類層級中是root,是每個類的父類。所有對象,包括數(shù)組以及類里面的方法。

     

1、Object與接口的關系

但是這里面沒有提及到接口。而且我們在IDE里面查詢對象以及接口的層級結構也不一樣: 
我們可以看到在java.util.Timer的類表示.

Timer.class 

Java中Class和Object是什么意思

但是我們可以使用 Ctrl + h 查看它的類結構體系如下:      
Java中Class和Object是什么意思      

Java中Class和Object是什么意思

然后我們再來查看JDK中的接口 java.util.concurrent.Future 的類繼承體系。      
Java中Class和Object是什么意思      

Java中Class和Object是什么意思

Java中Class和Object是什么意思

Java中Class和Object是什么意思

但是我們可以在查看Java虛擬機規(guī)范 – 9.2. Interface Members 。      
Java中Class和Object是什么意思      

Java中Class和Object是什么意思

如果一個沒有直接父類接口,接口聲明了一個public abstract方法m,JVM將會為接口標隱含定義了Object類中的方法簽名完全相同的方法。除非在接口明確的定義了在接口中定義了同樣方法簽名,同樣返回值以及throws同樣的異常。

但是要注意以下兩點:

  1. 如果在接口中定義了與Object定義相同的方法,并且聲明為final。那么就會出現(xiàn)編譯異常。

  2. 如果在接口中定義了與Object定義簽名相同的方法。但是它不符合Object的重寫規(guī)范那。就是返回值類型不同,或者拋出不兼容的異常,或者不是abstract的方法。也會出現(xiàn)編譯異常。

     

2、Object中的方法

下面我們就來看一看Object里面的方法。Object作為通用的類,作為通用的類不能夠滿足于各種各樣的業(yè)務場景,所以對于它所有的非final方法(equals、hashcode、toString、clone和finalize)都有明確的通用約定,因為它們的設計成是要被覆蓋的。任何一個類,它在覆蓋這些方法的時候,都有責任遵守這些通用約定,其他依賴于這些約定的類(例如HashMap和HashSet)就無法結合該類一起正常工作了。

     
2.1 getClass – 獲取當前對象的類類型

獲取當前對象的類類型,使用這個對象可以執(zhí)行反射操作。

     
2.2 hashCode – 獲取當前對象的hashCode

返回當前對象的hash code值。當這個對象需要使用到hash表的時候需要重寫這個方法。同時也需要重寫equals方法。

     
2.3 equals – 判斷兩個對象是否相等

表明其它對象是否寫當前對象相等。默認是判斷兩個對象的引用地址是否相等。而在Effective Java中推薦覆蓋equals方法的時候總要覆蓋hashCode方法。而需要覆蓋equals方法的時候需要遵守它的通用規(guī)定。下面就約定的內(nèi)容:

  1. 自反性(reflexive):對于任何非null的引用值x,x.equals(x)必須返回true.

  2. 對稱性(symmetric):對于任何非null的引用值x,y,當且僅當y.equals(x)返回true時x.equals(y)必須返回true。

  3. 傳遞性(transitive):對于任何非null的引用值x,y,z。如果x.equals(y)返回true.并且y.equals(z)也返回true,那么x.equals(z)也必須返回true.

  4. 一致性(consistent):對于任何非null的引用值x和y,只要equals的比較操作在對象中所用的信息沒有被修改,多次調用x.equals(y)就會一致地返回true,或者一致地false。

  5. 對于任何非null的引用值x,x.equals(null)必須返回false

     
2.4 clone – 對象克隆

創(chuàng)建并且返回這個對象的copy。精確的表達”copy”依賴于該對象的類。一般情況下,對于對象x:

  1. 表達式:x.clone() != x,將會為true

  2. 表達式:x.clone().getClass() == x.getClass(),將會為true

  3. 表達式:x.clone().equals(x),將會為true. 
    默認情況下滿足這種情況,但這個并不是絕對的。 
    按照約定:一般通過調用super.clone獲取到返回對象。如果一個類以及它的所有超類就會出現(xiàn):x.clone().getClass() == x.getClass().

而且Object類并沒有實現(xiàn)Cloneable接口。因此如果一個類并沒有實現(xiàn)Cloneable接口,而且它的實例還調用clone方法就會出現(xiàn)CloneNotSupportedException.

     
2.5 toString – 返回代表這個對象的String

雖然java.lang.Object提供了toString方法的一個實現(xiàn),但它返回的是類的名稱以及一個”@”符號,接著是散列碼的無符號十六進制表示法。例如:Object@163b91,這種表示方法對于用戶是非常不友好的。所以toString的約定是:建議所有的子類都覆蓋這個方法。

     
2.6 notify – 喚醒被當前線程監(jiān)控正在等待的一個線程

喚醒被當前線程監(jiān)控正在等待的一個線程。如果有這個對象中許多線程正在等待,就會從它們中選擇一個來喚醒。這個選擇是根據(jù)各個不同的系統(tǒng)來任意決定的,也就是說多個線程在waiting是隨機選擇一個線程來喚醒。

這個方法僅僅能夠被是這個對象的monitor調用。一個線程可以通過以下3種方式來成為這個對象的monitor的擁有者。

  1. 執(zhí)行這個對象的同步實例方法。

  2. 執(zhí)行這個對象的同步代碼塊。

  3. 對于Class對象,執(zhí)行一個同步靜態(tài)方法。

并且在同一時間只能有一個線程做為一個對象minitor的擁有者。 

     
2.7 notifyall – 喚醒被當前線程監(jiān)控正在等待所有線程

喚醒被當前線程監(jiān)控正在等待所有線程。如果是一個線程被這個對象monitor的話,可以調用wait方法。

這個方法也僅難能被這個對象的monitor的擁有者調用。具體可以看一下notity方法中介紹一個線程如何才能夠成功一個monitor的擁有者。

     
2.8 wait() || wait(long) || wait(long, int)

這三個方法的功能都是一樣的,都是讓線程進入等待狀態(tài)。只是等待的超時時間的設置方式不同。調用這三個方法都是暫停當前線程,直到另外一個線程調用notify方法或者notifyall方法或者其它線程中斷了當前線程,或者過了超時時間。

     
2.9 finalize – 調用這個對象的垃圾回收

當沒有引用指向這個對象的時候,調用這個對象的垃圾回收。子類可以重寫finalize方法用來處理系統(tǒng)資源或者執(zhí)行其它清除操作。

一般情況下當JVM確定這個對象沒有被其它對象引用的時候,就會調用finalize方法。一般的純Java編寫的Class不需要重新覆蓋這個方法,因為Object已經(jīng)實現(xiàn)了一個默認的,除非我們要實現(xiàn)特殊的功能(這 里面涉及到很多東西,比如對象空間樹等內(nèi)容)。

不過用Java以外的代碼編寫的Class(比如JNI,C++的new方法分配的內(nèi)存),垃圾回收器并不能對這些部分進行正確的回收,這時就需要我們覆蓋默認的方法來實現(xiàn)對這部分內(nèi)存的正確釋放和回收(比如C++需要delete)。

總之,finalize相當于析構函數(shù),他是垃圾回收器回收一個對象的時候第一個要調用的方法。不過由于Java的垃圾回收機制能自動為我們做這些事情,所以我們在一般情況下是不需要自己來手工釋放的。

     

3、Object 與 Class

先有Class還是先有Object? 
Java的對象模型中:

  1. 所有的類都是Class類的實例,Object是類,那么Object也是Class類的一個實例。

  2. 所有的類都最終繼承自Object類,Class是類,那么Class也繼承自Object。


感謝各位的閱讀!關于“Java中Class和Object是什么意思”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI