7 繼承與多型

2021-08-10 05:15:42 字數 2101 閱讀 6020

設計繼承時,把共同的程式**放入某個類,告訴其他類:此類是它們的父類

子類繼承父類意味著繼承了父類的成員,類的成員指的是例項變數和方法,但是子類可以加入自己的方法和例項變數,可以覆蓋掉繼承自父類的方法,例項變數不會被覆蓋.

設計父類,辨別出所有子類共同的,抽象的特徵,以此為基礎設計.

當呼叫子類覆蓋的父類方法時,會呼叫與該物件型別最接近的方法,即最低階的會勝出,即層次樹最下面.

繼承關係通過is-a檢測,如老虎是個動物,老虎類繼承自動物類.

x is-a y意味著x可以做任何y可以做的事情.

通過super版的方法實現子類中仍然引用父類的方法再加上額外的行為

public void roam()
訪問許可權

private default protected public

從左到右限制程度越小

public型別成員會被繼承

private型別成員不會繼承

繼承的意義

1.避免了重複的程式**

2.定義出共同的協議(方法)

當你定義出一組類的父型時,你可以用字型的任何類來填補任何需要或期待父型的位置.

因為會通過宣告為父型型別的 物件引用來引用它的子型物件

多型性一般宣告引用和建立物件的方法

dog mydog=new dog();

第一步要求jvm分配空間給引用變數mydog,此變數永遠被固定為dog型別

第二步要求jvm分配堆空間給新建立的dog物件

第三步:將dog賦值給引用變數mydog,即設定遙控器

由上可知引用變數型別與物件的型別必須相符

但在多型下,引用與物件型別可以不同 如

animal mydog=new dog();

運用多型時,引用型別可以是實際物件型別的父類

換句話說任何extends過宣告引用變數型別的物件都可賦值給這個引用變數

舉例如下

animal animals=new animal[2];

animals[0]=new dog();

animals[1]=new cat();

animals[2]=new wolf();

for(int i=0;i

當i=0,呼叫dog的eat(),roam()其他同理.

不僅如此,引數和返回型別也可以多型,例如如果宣告乙個父類的引用變數,如animal,並賦值子類物件給它,如dog,則dog物件可當做方法引數(要求為animal物件)傳入,則方法中相應的執行內容變為dog物件的執行內容

總結:1.編寫方法,將引數宣告為父類型別,可以在執行時傳入任何子類物件

2.防止特定的方法被覆蓋,可以把該方法標識上final,將整個類標識為final,則表示沒有任何方法可以被覆蓋

3.有三個方法可以防止某個類作為父類

1)訪問控制,類可以不標記為公有,非公有的類只能被同乙個包的類做出子類

2)final修飾符表示繼承樹的末端,不可繼承

3)只讓類擁有private的構造程式

遵守合約:覆蓋的規則

覆蓋父類的方法,要遵守合約,如父類方法沒有引數且返回布林值,子類方法必須同樣設定.方法就是合約的標誌.

子類:toaster

對於turnon(),這不是覆蓋,因為改變了引數

編譯器會尋找引用變數型別來決定是否可以呼叫該引用變數的特定方法,但在執行期jvm尋找的並不是引用變數型別,而是堆上的物件,因此若編譯器同意這個呼叫,則唯一能通過的方法是覆蓋的方法有相同的引數和返回型別.所以在執行期呼叫的還是父類的turnon()方法,覆蓋失敗.

1.引數必須一樣,且返回型別必須相容

覆蓋父類方法的子類一定要使用相同的引數,父類方法的返回型別是什麼,子類要宣告一樣的型別或者該型別的子類.

2.不能降低方法的訪問許可權

訪問許可權必須相同,或者更加開放,不能覆蓋掉乙個公有的方法並將它標記為私有

方法的過載(overload)

過載是兩個方法名稱相同,但引數不同,過載與多型毫無關係

過載不是用來滿足定義在父類的多型合約,過載方法比較有擴充套件性

1.返回型別可以不同

2.不能只改變返回型別

過載的條件是使用不同的引數

3.可以更改訪問許可權

繼承與多型

繼承 繼承是c 語言支援 重用及多型的重要機制。通過繼承,可以繼承可以在現有類的基礎上派生出新類,新類將共享現有類的成員,並且還可以新增新的成員。c 語言中,重用主要表現為可以使用現成的類 如.net框架類庫中的類 來定義新類,主要方法有組合和繼承兩種 繼承是物件導向程式設計支援 重用的另乙個重要機...

繼承與多型

虛函式只要在基類裡定義,所以繼承類都不用重新定義為虛函式,自動成為虛函式。虛函式必須有實現,普通成員函式在沒有呼叫時可以沒有實現 定義 class animal 只需要在基類定義函式為虛,子類中不需要新增virtual.smile函式在沒有呼叫時可以不實現。當有函式為虛函式時,析構函式應定義為vir...

繼承與多型

繼承需要符合的關係 is a,父類更通用 子類更具體 子類繼承父類的所有屬性和方法 不包括父類構造方法 super可以呼叫父類的方法和構造方法 子類可以重寫父類的方法 使用多型之後,當需要增加新的子類型別時,無需更改總部類,程式的可擴充套件性及可維護性增強 簡單來說,多型是具有表現多種形態的能力的特...