首頁  >  文章  >  Java  >  Java中的隱藏與覆蓋的概述及其之間的區別

Java中的隱藏與覆蓋的概述及其之間的區別

php是最好的语言
php是最好的语言原創
2018-08-06 14:39:032176瀏覽

這兩天學了多態,自然就牽涉到了方法的重寫。在筆者瞎用程式碼折騰的過程中,發現報錯類型提到了「This static method cannot hide the instance method from Fu」(如下圖),於是了解到除了覆蓋(重寫)外還有隱藏這一回事,各種查資料,終於找到了一個比較詳細的文章,解決了我不少的疑惑。轉發下,以後可能還少不了回來來看。

Java中的隱藏與覆蓋的概述及其之間的區別

1、編譯時類型和執行時間類型

Java的參考變數有兩個類型,一個是編譯時類型,一個是運行時類型

編譯時類型:由宣告該變數時使用的類型決定

執行階段類型:由該變數指向的物件類型決定

如果編譯時類型和執行時間類型不一致,會出現所謂的多態。因為子類其實是一種特殊的父類,因此java允許把一個子類物件直接賦值給一個父類引用變量,無須任何類型轉換,或者被稱為向上轉型,由系統自動完成。

如 Father  f  =  new  Son();  Son是Father的子類別

引用變數f就會出現編譯時類型和執行時類型不一致的情況編譯時是Father類型的執行時是Son類型的

當變數的編譯時類型和執行時間類型不一致時,透過變數存取它所引用的物件的實例時,該實例變數的值由宣告該變數的型別決定。

透過變數存取它所引用的物件的方法時,該方法的行為由所引用的物件實際類型決定。

2、隱藏與覆寫

覆寫:子類別重寫父類別的方法,要求方法名稱和參數型別完全一樣(參數不能是子類別),傳回值和異常比父類別小或相同(即為父類別的子類別),存取修飾符比父類別大或相同。

覆寫是實例方法的

方法不能交叉覆寫:子類別實例方法不能覆寫父類別的靜態方法;

               子類別的靜態方法也無法覆寫父類別的實例方法(編譯時報錯誤)

隱藏:父類別和子類別擁有相同名字的屬性或方法( 方法隱藏只有一種形式,就是父類別和子類別存在相同的靜態方法)時,父類別的同名的屬性或方法形式上不見了,實際上是還是存在的。

隱藏是對於靜態方法和成員變數(靜態變數和實例變數)而言的

(1)當發生隱藏的時候,宣告類型是什麼類,就調用對應類別的屬性或方法,而不會發生動態綁定

  (2) 屬性只能被隱藏,不能覆寫

 (3)變數可以交叉隱藏:子類別實例變數/靜態變數可以隱藏父類別的實例/靜態變數

3、隱藏和覆寫的差異

(1)被隱藏的屬性,在子類別被強制轉換成父類別後,存取的是父類別中的屬性

  在無強制轉換時子類別要存取父類別的屬性使用super關鍵字

(2)被覆寫的方法,子類別強制轉換成父類別後,呼叫的還是子類別本身的方法

     子類別要是想要存取父類別的方法,可以使用super關鍵字

相關文章:

關於java覆蓋equals更深層的方法概述

#PHP和JAVA中的重載(overload)和覆蓋(override) 介紹

以上是Java中的隱藏與覆蓋的概述及其之間的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn