面向?qū)ο蟪绦蛟O(shè)計(jì)的三大原則是封裝性、繼承性、多態(tài)性。
這里主要說一下多態(tài)性,在說多態(tài)之前先說幾個(gè)概念:
將一個(gè)方法調(diào)用同一個(gè)方法主體連接到一起就稱為“綁定”(Binding)。
若在程序運(yùn)行前執(zhí)行綁定(由編譯器和鏈接程序完成——如果有的話),就叫作“早期綁定”。
Java在運(yùn)行時(shí)動(dòng)態(tài)的調(diào)用方法,這叫后期綁定(late binding,后期綁定也叫作“動(dòng)態(tài)綁定”或“運(yùn)行時(shí)間綁定”)。
注:final方法不能被重載,對(duì)方法的調(diào)用可以在編譯時(shí)解決,這屬于早期綁定。
Java的所有方法綁定都采用“后期綁定”技術(shù),除非一個(gè)方法已被明確聲明成final。也就是說,我們通常不必關(guān)心是否會(huì)進(jìn)行后期綁定——它是自動(dòng)進(jìn)行的。
多態(tài)性是指允許不同類的對(duì)象對(duì)同一消息作出響應(yīng)。做個(gè)簡(jiǎn)單比喻:你兒子喊你,你會(huì)說:“嗨,兒子”。你父親喊你,你會(huì)說:“嗨,爸爸。”。對(duì)同一消息(有人喊你),做出的反應(yīng)不同(做出不同的反應(yīng))。
常見的兩種多態(tài)方式為:① 重寫 ② 重載
重寫(Overriding)是父類與子類之間多態(tài)性的一種表現(xiàn),如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Overriding)。子類的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類中的定義,而父類中的定義則被“屏蔽”了。
注意:
1、 方法名稱一定要一樣
2、 返回值的數(shù)據(jù)類型要一樣。
3、 所使用的參數(shù)要一樣,包括參數(shù)個(gè)數(shù)及每個(gè)參數(shù)的數(shù)據(jù)類型也要一樣。
4、 限定詞的使用權(quán)限只能越開放,不能越封閉。
5、 類方法不能被重寫,只有未使用static限定詞的方法可以被重寫。
重載(Overloading)是一個(gè)類中多態(tài)性的一種表現(xiàn)。如果在一個(gè)類中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。
為什么要重載方法?
重載方法允許Java支持運(yùn)行時(shí)多態(tài)性。多態(tài)性是面向?qū)ο缶幊痰谋举|(zhì),原因如下:它允許通用類指定方法,這些方法對(duì)該類的所有派生類都是公用的。同時(shí)該方法允許子類定義這些方法中的某些或全部的特殊實(shí)現(xiàn)。重載方法是Java實(shí)現(xiàn)它的多態(tài)性—“一個(gè)接口,多個(gè)方法”的另一種方式。
構(gòu)造函數(shù)可以從超類那里繼承,也可以互相重載。類的若干個(gè)構(gòu)造函數(shù)可以相互調(diào)用,一個(gè)構(gòu)造函數(shù)調(diào)用另一構(gòu)造函數(shù)時(shí),可以使用關(guān)鍵字this。同時(shí),這個(gè)調(diào)用語句應(yīng)該是整個(gè)構(gòu)造函數(shù)的第一個(gè)可執(zhí)行語句。
參考:Thinking.in.Java簡(jiǎn)體中文第二版