目錄
一個生動形象的例子
場景設定
1. 方法重寫(Method Overriding)
2. 動態綁定(Dynamic Binding)
3. 多態(Polymorphism)
歸納關系:
重寫
概念
條件
重寫的示例
重載與重寫的區別
動態綁定
定義:
多態性的實現:
與靜態綁定的區別:
示例:
多態
定義
實現方式
實現原理
應用場景
示例
意義
一個生動形象的例子
場景設定
想象一個汽車制造廠,其中有不同類型的車輛,如轎車、SUV和卡車。每種車輛都有自己獨特的駕駛行為,但它們都繼承自一個基本的“汽車”類。
1. 方法重寫(Method Overriding)
- 定義:子類提供與父類相同方法名、參數列表和返回值類型的方法,以覆蓋父類中的方法。
在這個例子中,假設“汽車”類有一個名為“drive”的方法,它輸出“汽車正在行駛”。但是,轎車、SUV和卡車在行駛時可能有不同的表現,因此它們各自重寫了“drive”方法。
- 轎車類重寫“drive”方法:輸出“轎車平穩行駛”。
- SUV類重寫“drive”方法:輸出“SUV越野行駛”。
- 卡車類重寫“drive”方法:輸出“卡車重載行駛”。
2. 動態綁定(Dynamic Binding)
- 定義:在運行時根據對象的實際類型來確定調用哪個重寫后的方法。
現在,假設制造廠有一個測試駕駛員,他只需要知道如何“駕駛”(即調用“drive”方法),而不需要知道具體是哪種車型。當他駕駛不同類型的汽車時,會動態地綁定到相應車型重寫的“drive”方法上。
3. 多態(Polymorphism)
- 定義:允許一個接口(或父類引用)引用多種實際類型,并根據實際類型執行對應的方法。
在測試中,駕駛員可以駕駛不同類型的汽車,而每種車型在行駛時展現出不同的行為,這就是多態的體現。雖然駕駛員都是通過調用“drive”方法來駕駛汽車,但具體的行駛表現卻因車型的不同而不同。
歸納關系:
- 方法重寫是實現多態的基礎,子類通過重寫父類的方法以提供自己獨特的行為。
- 動態綁定則使得在運行時能夠根據實際對象的類型來調用相應重寫后的方法,從而實現多態的效果。
- 多態則是這些技術綜合應用的結果,它允許我們使用統一的接口(如本例中的“drive”方法)來處理不同類型的對象,并在運行時展現出各自獨特的行為。
重寫
概念
方法重寫,是面向對象編程中的一個重要概念,特別是在Java這樣的面向對象的編程語言中。方法重寫允許子類提供一個與父類中已有方法具有相同方法簽名(即方法名和參數列表相同)的實現。
通過方法的重寫,子類可以改變或擴展從父類繼承的方法的行為。
條件
在Java中,要進行方法重寫,必須滿足以下條件:
- 方法名和參數列表必須與父類中被重寫的方法相同:
這是為了確保在運行時能夠正確地識別和調用重寫的方法。
- 訪問修飾符不能低于父類方法的訪問修飾符:
例如,如果父類方法時 public 的,那么重寫該方法的方法也必須時 public 的。
- 返回類型必須與父類中被重寫的方法的返回類型相同
- 子類方法拋出的異常類型必須是父類方法所拋出異常類型的子集:
子類方法可以不拋出異常,或者拋出與父類方法相同的異常或其子類型的異常。
- 被重寫的方法不能是 final 或 static 方法:
final 方法不能被重寫,而 static 方法與類關聯而非實例關聯,因此也不適用于重寫???????
重寫的示例
下面是一個簡單的Java示例,展示了如何重寫父類的方法:
class Animal { public void makeSound() { System.out.println("Some generic animal sound"); }
} class Dog extends Animal { @Override // 注解表明此方法是重寫父類方法 public void makeSound() { System.out.println("Bark"); }
} public class MethodOverridingExample { public static void main(String[] args) { Animal animal = new Dog(); // Animal類型的引用指向Dog類型的對象 animal.makeSound(); // 輸出"Bark",因為Dog類重寫了makeSound方法 }
}
在這個例子中,Dog 類繼承了 Animal 類,并重寫了 makeSound 方法。當我們通過 Animal 類型的引用調用 makeSound 方法時,實際上調用的是 Dog 類中重寫后的 makeSound 方法,輸出“Bark”。
重載與重寫的區別
- 重寫發生在父類和子類之間,子類提供與父類相同方法簽名的新實現。
- 重載發生在同一個類中,允許多個方法擁有相同的名字,但參數列表不同(參數數量、類型或順序不同)。
動態綁定
在Java中,動態綁定(Dynamic Binding)是一個核心概念,它允許在運行時根據對象的實際類型來確定調用哪個方法。這種機制是實現多態性的關鍵,使得程序能夠在運行時靈活地處理不同類型的對象。
定義:
動態綁定是指在程序運行過程中,根據具體的實例對象來確定調用哪個方法的過程。它不同于靜態綁定(前期綁定),后者在編譯時就已經確定了方法的調用關系。
多態性的實現:
- 動態綁定是實現多態性的重要因素。多態性允許我們使用父類類型的引用來引用子類的對象,并在運行時確定實際調用的方法。這種機制增加了程序的靈活性和可擴展性。
- 例如,假設有一個父類 Animal 和一個子類 Dog ,Dog 類重寫了 Animal 類的 makeSound() 方法。當我們創建一個 Dog 對象并將其賦值給一個 Animal 類型的引用時,通過該引用調用 makeSound() 方法,會動態地綁定到 Dog 類的實現上。
與靜態綁定的區別:
- 靜態綁定(也稱為前期綁定或編譯時綁定)是在編譯時就已經確定了方法的調用關系。它通常用于調用靜態方法、私有方法、構造方法以及使用 final 修飾的方法等。
- 動態綁定則是在運行時根據對象的實際類型來確定方法的調用關系。它主要用于實現多態性,使得程序能夠更加靈活和可擴展。
示例:
class Animal { void makeSound() { System.out.println("Animal sound"); }
} class Dog extends Animal { @Override void makeSound() { System.out.println("Bark"); }
} public class DynamicBindingExample { public static void main(String[] args) { Animal animal = new Dog(); // 向上轉型 animal.makeSound(); // 動態綁定到Dog類的makeSound()方法上 }
}
在上述示例中,當我們通過父類類型的引用 animal 調用 makeSound() 方法時,會動態地綁定到 Dog 類的實現上,輸出“Bark”。這就是動態綁定的一個典型應用示例。
注意事項:
- 動態綁定只適用于實例方法,不適用于靜態方法、私有方法和構造方法。這是因為這些方法在編譯時就已經確定了調用關系,無法進行動態綁定。
- 使用 final 修飾的方法也無法進行動態綁定,因為它們不能被重寫。
多態
在Java編程語言中,多態性是面向對象編程的三大特性之一,它允許一個接口(或基類引用)被多種數據類型所實現,并根據實際的類型執行對應的方法。以下是關于Java中多態的詳細介紹:
定義
多態(Polymorphism)是指允許一個接口(或父類引用)引用多種實際類型,并且可以根據實際的類型來執行對應的方法。簡言之,就是同一個方法調用可以有不同的實現方式。
實現方式
Java中多態的實現主要依賴于繼承和方法重寫。
- 繼承:子類可以繼承父類的方法定義和屬性,從而具備相同的方法簽名。
- 方法重寫(覆蓋):子類可以對繼承自父類的方法進行重寫,即在子類中重新定義與父類相同簽名的方法。
實現原理
多態的實現原理主要基于動態綁定(Dynamic Binding),也稱為后期綁定。在運行時,Java虛擬機會根據對象的實際類型來確定調用哪個重寫后的方法。這種機制使得相同的消息(即方法調用)可以根據不同的對象而具有不同的行為。
應用場景
多態在Java編程中有廣泛的應用,以下是幾個常見的應用場景:
- 接口和抽象類的使用:通過定義接口或抽象類,并在父類中聲明一組方法,具體實現留給子類。這樣,不同的子類可以實現各自獨特的行為。
- 方法重寫和回調機制:在父類中定義一個回調方法,子類重寫該方法,并由父類對象調用。這樣,根據不同的子類實現,可以執行相應的邏輯。
示例
假設有一個 Animal 類和兩個子類 Dog 和?Cat,每個類都有一個 makeSound 方法。通過多態,我們可以使用一個 Animal 類型的引用來引用 Dog 或 Cat 對象,并調用它們的 makeSound 方法。在運行時,Java虛擬機會根據對象的實際類型(Dog 或 Cat)來確定調用哪個實現。
Animal animal1 = new Dog();
Animal animal2 = new Cat(); animal1.makeSound(); // 輸出 "Woof!"
animal2.makeSound(); // 輸出 "Meow!"
意義
多態性提高了代碼的靈活性和可擴展性。通過多態,我們可以編寫更加通用的代碼,而無需關心具體的實現細節。這使得代碼更加易于維護和擴展。
注意事項
- 多態只適用于實例方法,不適用于靜態方法。因為靜態方法與類關聯,而不是與實例關聯。
- 多態的實現需要滿足兩個條件:一是方法必須在子類中被重寫;二是必須通過父類引用