繼承和多型

2021-08-05 18:28:33 字數 2307 閱讀 5219

物件導向的三大特徵:封裝、繼承、多型

1.繼承指的是子類繼承父類的屬性和方法且乙個類只能有乙個父類,它可以減少重複**的編寫和對**實現拓展。

2.理論上父類的所有屬性和方法都能被子類繼承,但父類的私有成員和建構函式是不能在子類中直接呼叫的,要訪問父類的私有屬性,必須要用get方法。

3.繼承的兩種情況:

在同一包內繼承:子類及子類建立的物件能訪問父類的public,protect以及預設的屬性和方法;

在不同包的繼承:子類能訪問父類的public,protect的屬性和方法,而子類建立的物件只能問public的屬性和方法。

private自能在自己類中訪問,public能在所有類中訪問,defaut預設的能在同乙個包內訪問,protect能在同一包內及子類中訪問。而這些都能在自己類中訪問。

作用域       當前類    同一package     子孫類       其它package    

public          true          true                  true            true

protected    true          true                  true            false

defaut          true         true                   false           false

private          true         false               false           false

注: 對於default型別修飾詞,如果其子孫類與父類如果是位於同乙個包內,則子孫類中的方法可以訪問無修飾詞修飾的父類方法;如果子孫類與父類是位於不同的包內,則子孫類中的方法無法訪問父類中的

無修飾詞修飾的父類方法。

4.在子類中可以重寫父類的方法(函式名,返回型別,引數都要一樣),也可以在子類中對父類的方法進行過載,但子類重寫後調不到父類的方法了,自能在類內部使用關鍵字super呼叫,而子類的物件調不到。

注意:1.自由可被繼承的方法才能被重寫,否則寫出來的方法是乙個新方法。

2.重寫的方法訪問許可權不能低於被重寫的方法,但丟擲的異常範圍不能高於被重寫方法。

3.重寫只能用在非靜態方法之間(不能用非靜態方法重寫靜態方法,也不能用靜態方法重寫非靜態方法,這些編譯都會報錯),靜態方法重寫靜態方法(編譯不會報錯但達不到重寫的目的了,所以不叫重寫)。因為:

static/final 方法的呼叫使用的靜態繫結策略,在編譯階段,編譯器就可以根據引用型別a來確定需要呼叫a中的getmember()。

而普通方法的呼叫採用的是動態繫結策略(在執行階段需要考慮引用型別和實際型別(new)),這裡就不多說了。

4.靜態方法和資料域(有static關鍵字的),子類方法重寫沒有進行覆蓋而是隱藏了,形成隱藏域子類可以用super關鍵字和類名進行呼叫。

5.自動轉型(向上轉型):這是實現多型的機制。父類的建立的物件但用了子類的建構函式例如animal a = new cat(),或將子類建立的物件feed(cat)作為引數傳給形參為父類型別的函式  feed(animal a).是自動轉型的兩種形式。且子類一旦自動轉型為父類,就只能呼叫父類中已定義的方法(但執行的是子類重寫後的方法)而不能呼叫子類中自己獨有的方法。

強制轉換(向下轉型):這是使用(子類)進行強制轉換,但必須要是子類,可用instanceof先做判斷,從而提高**健壯性。

6.重寫函式的呼叫:乙個物件是呼叫父類的函式還是子類重寫的方法看他例項化物件時是用的誰的建構函式,那麼就呼叫誰的方法。

7.構造方法鏈:在例項化子類是預設先呼叫父類的無參構造方法(用super關鍵字可呼叫有參構造方法)。個類若沒有宣告構造方法,預設有乙個無參構造方法,若宣告了有參的構造方法,則無參構造方法被覆蓋,所以類要拓展時最好宣告乙個無參構造法官法,避免編譯出錯。

8.super關鍵子:可用來呼叫父類的方法,但是不可super.super.a(),這樣連續呼叫。

9.多型:

使用多型的原因

使用多型的程式的可維護性和可擴充套件性增強

多型分類

靜態多型:

靜態多型也稱編譯時多型,即在編譯時決定呼叫哪種方法;

靜態多型一般指方法過載;

只要構成了方法過載,就可以認為形成了靜態多型的條件;

靜態多型與是否發生繼承沒有必然聯絡

動態多型:

動態多型也稱執行時多型,即在執行時才能決定呼叫哪個方法;

必須要有繼承關係存在(父類可以是抽象類,普通類,甚至子類可以實現介面);

在繼承中必須要有方法的覆蓋;

必須由基類的應用指向派生類的例項,並且通過父類的引用呼叫被覆蓋的方法(實現的是派生類重寫後的方法)

繼承和多型

物件導向程式設計時有乙個非常重要的原則 write once only once 編寫一次,且僅編寫一次 如果沒有繼承這種機制我們可能要重複寫很多 下面來看一下繼承 一 繼承 1 子類如果繼承父類必須使用extends這個關鍵字 2 子類呼叫父類的構造方法使用super關鍵字,也可以通過super來...

繼承和多型

物件導向程式設計時有乙個非常重要的原則 write once only once 編寫一次,且僅編寫一次 如果沒有繼承這種機制我們可能要重複寫很多 下面來看一下繼承 一 繼承 1 子類如果繼承父類必須使用extends這個關鍵字 2 子類呼叫父類的構造方法使用super關鍵字,也可以通過super來...

繼承和多型

類還有乙個重要的特性就是繼承,什麼是繼承?它又有什麼作用呢?繼承最主要的目的就是為了擴充套件原類的功能,加強或改進原類所沒有定義的屬性及方法。例如我們有狗這個類,可是狗的種類還是有很多,比如說博美狗,聖伯納,柴犬等等,如果只用狗一種類來定義所有種類狗的屬性及方法,那麼用這個類所產生出來的物件一定會有...