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