java 判断object类型_Java 类继承机制
封裝、繼承、多態(tài)是面向?qū)ο蟮娜筇卣?#xff0c;“繼承”最主要的目的是為了實(shí)現(xiàn)代碼的可復(fù)用性。通過父類與子類的繼承關(guān)系,子類繼承了父類的成員函數(shù)和成員變量,提高了代碼的重復(fù)利用率。同時(shí),子類也可以擴(kuò)展自己特有的成員,豐富功能。
在Java中,類與類之間通過extends 關(guān)鍵字來定義繼承關(guān)系。Java規(guī)定,類之間只能是單繼承的關(guān)系,子類只能繼承一個(gè)父類,但是可以實(shí)現(xiàn)多個(gè)接口。
Object
Object是Java中規(guī)定的一切類的起源,任何類都需要繼承Object,在object 中規(guī)定了以下11個(gè)方法:
- toString()
- equals(Object object)
- hashCode()
- getClass()
- notify ()
- notifyAll()
- wait()
- wait(long timeout)
- wait(long timeout,int nanos)
這11個(gè)方法是所有對象都擁有的成員,我們可以繼承并進(jìn)行重寫,以實(shí)現(xiàn)自己的機(jī)制。對這上述11個(gè)類,其著重功能點(diǎn)不同,可以按照功能點(diǎn)進(jìn)行分組如下。
輸出字符串
toString()方法的作用是返回該對象的文本描述,默認(rèn)實(shí)現(xiàn)是使用類名@16進(jìn)制哈希碼的形式。比如聲明了Point 類,實(shí)例化該類的一個(gè)對象Point pt=new Point() pt.toString()輸出的就為 Point@76f9aa66。
對象間相等性的判斷
equals()
hashCode()
在java 中,存在兩種不同的變量類型,基本數(shù)據(jù)類型和對象類型。聯(lián)系到底層的存儲機(jī)制,二者的區(qū)別在于,基本類型都存儲在棧中,對象類型存儲到堆中。Java提供了8中基礎(chǔ)類型,而同時(shí)對于每種基礎(chǔ)類型,又以對象的方式提供相應(yīng)的包裝類型。具體如下:
- byte----Byte
- short----Short
- int----Integer
- long----Long
- double----Double
- float----Float
- char----Char
- boolean----Boolean
在判斷這兩種類型的變量是否相等的問題上,我們應(yīng)該使用的機(jī)制也不同。通常情況下,我們使用 === 來進(jìn)行比較,在基礎(chǔ)類型中,這沒有問題,比較的依據(jù)是內(nèi)容相等,則變量等價(jià)。但是對于對象類型的變量,這比較的是變量的內(nèi)存地址,這就意味著,除非是同一個(gè)對象,否則不可能相等。在object中,equals 的本質(zhì)就是==,但是例如Integer、String等類型重寫了equals方法,變成了內(nèi)容的比較。
繼承下的一些機(jī)制
變量初始化
子類初始化的過程中,先進(jìn)行父類的初始化,可通過super來調(diào)用父類相應(yīng)的構(gòu)造方法,沒有使用super的情況下,將調(diào)用父類的默認(rèn)構(gòu)造方法。如果聲明了一個(gè)子類變量,其實(shí)例化順序如下:
- 父類初始化
- 開辟類變量內(nèi)存空間并賦值
- 執(zhí)行靜態(tài)代碼段
- 子類初始化
- 開辟類變量內(nèi)存空間并賦值
- 執(zhí)行靜態(tài)代碼段
- 父類變量開辟空間并賦值
- 執(zhí)行父類構(gòu)造函數(shù)
- 子類變量開辟空間并賦值
- 子類構(gòu)造函數(shù)
注意,在父類構(gòu)造方法中不要調(diào)用可重寫的方法,因?yàn)橐坏┳宇愡M(jìn)行了重寫,調(diào)用父類構(gòu)造方法的時(shí)候就會調(diào)用子類的方法。而且,此時(shí)子類構(gòu)造方法中,如果引用了子類變量,此時(shí)子類變量還未進(jìn)行賦值操作,為null。
上述代碼輸出結(jié)果為:
開始測試-----------------
null
測試結(jié)束-----------------
靜態(tài)綁定與動態(tài)綁定
子類對象可以賦值給父類引用變量,這叫多態(tài),實(shí)際執(zhí)行的調(diào)用的是子類的方法,這叫動態(tài)綁定。與之相對的是靜態(tài)綁定,變量綁定到變量的類型。靜態(tài)綁定在程序編譯階段即可決定,動態(tài)綁定需要在運(yùn)行時(shí)決定。
重載和重寫
子類繼承父類的public方法,如果在子類中同時(shí)對該方法進(jìn)行了重載,在調(diào)用時(shí),會同等看待這兩種不同來源的重載方法,依據(jù)參數(shù)類型進(jìn)行比較,調(diào)用符合度較高的方法。
父子類型轉(zhuǎn)換
子類對象可以賦值給父類型的變量,這樣稱之為向上轉(zhuǎn)換,但是父類對象不可賦值給子類對象的變量,通過強(qiáng)制轉(zhuǎn)換也不行,也就是不可進(jìn)行向下轉(zhuǎn)換。
繼承實(shí)現(xiàn)的機(jī)制
Java是靜態(tài)語言,需要經(jīng)過編譯的過程,經(jīng)過編譯后將原來.java格式的源代碼文件轉(zhuǎn)換為.class的文件。JVM通過類加載機(jī)制,將.class文件加載到內(nèi)存中,形成類的數(shù)據(jù)結(jié)構(gòu)。
在類的數(shù)據(jù)結(jié)構(gòu)中,會記錄父類與子類的關(guān)系。
總結(jié)
以上是生活随笔為你收集整理的java 判断object类型_Java 类继承机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 序列_MySql中序列的应用
- 下一篇: Java pdf文件传输_java中pd