父/子類中成員方法僅僅同名
父/子類中成員方法同原型
方法覆蓋
在類的繼承體系結構中,如果子類中出現了與父類中有同原型的方法,那麼認為子類中的方法覆蓋了父類中的方法(也稱為方法重寫);
通過子類的實例調用被覆蓋的方法時,將總是調用子類中的方法,而父類中的方法將被隱藏。
區分方法重寫和方法重載
方法覆蓋(重寫)和方法重載是兩個極易混淆的概念,必須嚴格區分;
方法覆蓋出現的前提條件之一是必須有繼承發生的情況下,而且要求父類和子類中的方法必須同原型;
方法重載時,繼承並不是必需的,它只要求方法名稱相同,而參數列表則必須不同,換言之,各方法的原型其實是不同的。
引用轉型
基類的引用可以指向派生類的對象,如:
BaseClass obj = new DerivedClass();
這樣的語句是合法的;
但是派生類的引用則不可以指向基類的對象,如:
DerivedClass obj = new BaseClass();
這樣的語句將引發錯誤。
既然基類的引用可以指向派生類的實例,如果基類和派生類中存在方法覆蓋的情況,那麼通過基類的引用將會調用到哪個類中的方法呢?如下圖:
從上例中可以看出,父類的引用指向哪個類的實例就調用哪個類中的方法;
同樣是使用父類的引用,調用同一個名稱的方法,卻可以得到不同的調用結果,這就是Java中的多態,即:同一函數,多種形態;
實際上多態包括動態多態和靜態多態。
靜態多態靜態多態也稱為編譯時多態,即在編譯時決定調用哪個方法;
靜態多態一般是指方法重載;
只要構成了方法重載,就可以認為形成了靜態多態的條件;
靜態多態與是否發生繼承沒有必然聯繫。
動態多態動態多態也稱為運行時多態,即在運行時才能確定調用哪個方法;
形成動態多態必須具體以下條件:
必須要有繼承的情況存在;在繼承中必須要有方法覆蓋;必須由基類的引用指向派生類的實例,並且通過基類的引用調用被覆蓋的方法;由上述條件可以看出,繼承是實現動態多態的首要前提。