Java覆蓋 過載 隱藏相關知識

2021-07-13 18:33:59 字數 1573 閱讀 9048

發生在子類與父類的之間,指在在子類中宣告乙個和父類具有相同的方法名,引數列表,返回值,訪問許可權等的方法,即在子類中重新編寫方法實現的功能。

構成覆蓋需滿足以下條件:

父類中的static方法不可以被覆蓋;

父類中的final方法不可以被覆蓋;

方法的簽名、引數個數以及引數型別都要相同;

對於返回型別要說明兩點:

1.如果返回型別是引用型別,則覆蓋方法的返回型別可以宣告為父類方法宣告的返回型別的子型別;

2.如果返回型別是基本型別,則覆蓋方法的返回型別必須和父類方法的返回型別相同;

子類方法的訪問許可權要大於等於父類的訪問許可權;

子類方法可以改變某些方法修飾符,如:synchronized、native和strictfp。

子類方法的throws子句可以和父類方法不同,它列出的每乙個異常型別都應該和父類中的異常型別相同或者是父類異常型別的子類;

隱藏現象發生在子類和父類之間,隱藏是針對父類中成員變數、靜態方法和成員內部類而言。

當子類宣告與父類中成員變數具有相同的變數名的變數時,則實現了對父類中成員變數的隱藏;

當子類宣告了與父類中的靜態成員方法具有相同的方法名,引數列表和相同的返回值時,則實現了對父類中靜態方法的隱藏。方法隱藏只有一種形式,就是父類和子類存在相同的靜態方法。

父類和子類擁有相同名字的屬性或者方法時,父類的同名的屬性或者方法形式上不見了,實際是還是存在的。

被隱藏的屬性,在子類被強制轉換成父類後,訪問的是父類中的屬性。

public

static

class

parent

public

static

class

child

extends

parent

parent p = new child();

log.e("test","p.i = "+p.i);

輸出結果:p.i = 0

上面的**中,parent和child中都定義了變數i,在main方法中,我們用parent引用乙個child物件,如果例項變數與方法一樣,允許被覆蓋,那麼列印的結果應該是1,但是實際的結果確是0。

但是如果我們在child的方法中直接使用i,那麼用的會是child物件自己定義的例項變數i,這就是隱藏,child物件中的i把parent物件中的i給隱藏了,這條規則對於靜態變數同樣適用。

public

static

class

parent

}public

static

class

child

extends

parent

}parent p = new child();

p.fun();

輸出結果:parent.fun()

這種現象也叫做隱藏。

父類的靜態方法fun()是不能被重寫的。

對於static方法,根本不存在像多型那樣的動態分派機制,jvm 不會根據物件引用的實際型別來呼叫對應的重寫方法。

最好避免用物件引用的方式來訪問乙個static方法。

過載 覆蓋 隱藏

學習c 些許時間了,隨便寫點東西吧。過載 覆蓋 隱藏 1.過載 相同作用域,函式名相同,引數不同,virtual關鍵字可有可無。2.覆蓋 不同作用域,函式名相同,引數相同,有virtual關鍵字。3.隱藏 一般是父類和子類之間,函式名相同,引數不同時,不管有沒有virtual關鍵字都會導致隱藏。函式...

覆蓋,隱藏,過載

1.過載 覆蓋與隱藏 1 過載 成員函式具有以下的特徵時發生 過載 a 相同的範圍 同乙個類中 b 函式的名字相同 c 引數型別不同 不能進行隱式型別轉換 d virtual關鍵字可有可無 2 覆蓋 也叫 繼承 指派生類函式覆蓋基類函式,特徵是 a 不同的範圍 分別位於基類與派生類中 b 函式名字相...

覆蓋,過載,隱藏

覆蓋 重寫 過載,隱藏這三者的概念很容易混淆,弄清楚這三者的區別與聯絡是有必要的.覆蓋 重寫 override,過載 overload,多型 polymorphis函式名字相同 引數不相同 引數個數或引數型別不同 相同作用域 virtual關鍵是可有可無 函式名字相同 引數相同 引數個數和引數型別都...