這兩天學了多態,自然就牽涉到了方法的重寫。在筆者瞎用程式碼折騰的過程中,發現報錯類型提到了「This static method cannot hide the instance method from Fu」(如下圖),於是了解到除了覆蓋(重寫)外還有隱藏這一回事,各種查資料,終於找到了一個比較詳細的文章,解決了我不少的疑惑。轉發下,以後可能還少不了回來來看。
1、編譯時類型和執行時間類型
Java的參考變數有兩個類型,一個是編譯時類型,一個是運行時類型
編譯時類型:由宣告該變數時使用的類型決定
執行階段類型:由該變數指向的物件類型決定
如果編譯時類型和執行時間類型不一致,會出現所謂的多態。因為子類其實是一種特殊的父類,因此java允許把一個子類物件直接賦值給一個父類引用變量,無須任何類型轉換,或者被稱為向上轉型,由系統自動完成。
如 Father f = new Son(); Son是Father的子類別
引用變數f就會出現編譯時類型和執行時類型不一致的情況編譯時是Father類型的執行時是Son類型的
當變數的編譯時類型和執行時間類型不一致時,透過變數存取它所引用的物件的實例時,該實例變數的值由宣告該變數的型別決定。
透過變數存取它所引用的物件的方法時,該方法的行為由所引用的物件實際類型決定。
2、隱藏與覆寫
覆寫:子類別重寫父類別的方法,要求方法名稱和參數型別完全一樣(參數不能是子類別),傳回值和異常比父類別小或相同(即為父類別的子類別),存取修飾符比父類別大或相同。
覆寫是實例方法的
方法不能交叉覆寫:子類別實例方法不能覆寫父類別的靜態方法;
子類別的靜態方法也無法覆寫父類別的實例方法(編譯時報錯誤)
隱藏:父類別和子類別擁有相同名字的屬性或方法( 方法隱藏只有一種形式,就是父類別和子類別存在相同的靜態方法)時,父類別的同名的屬性或方法形式上不見了,實際上是還是存在的。
隱藏是對於靜態方法和成員變數(靜態變數和實例變數)而言的
(1)當發生隱藏的時候,宣告類型是什麼類,就調用對應類別的屬性或方法,而不會發生動態綁定
(2) 屬性只能被隱藏,不能覆寫
(3)變數可以交叉隱藏:子類別實例變數/靜態變數可以隱藏父類別的實例/靜態變數
3、隱藏和覆寫的差異
(1)被隱藏的屬性,在子類別被強制轉換成父類別後,存取的是父類別中的屬性
在無強制轉換時子類別要存取父類別的屬性使用super關鍵字
(2)被覆寫的方法,子類別強制轉換成父類別後,呼叫的還是子類別本身的方法
子類別要是想要存取父類別的方法,可以使用super關鍵字
相關文章:
#PHP和JAVA中的重載(overload)和覆蓋(override) 介紹
以上是Java中的隱藏與覆蓋的概述及其之間的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!