Java中的重寫和重載是代碼復用的重要手段,但它們有不同的使用場景和實現方式。下面我們來分別探討它們的異同點。
重載
public class OverloadDemo { public void test(int a) { System.out.println("方法1:" + a); } public void test(int a, int b) { System.out.println("方法2:" + a + ", " + b); } }
Java中的重載是指在一個類中定義多個具有相同名稱但參數類型和個數不同的方法,使得它們可以響應不同的方法調用。上面的代碼中,我們定義了兩個test方法,一個有一個參數a,另一個有兩個參數a和b。當我們調用test方法時,Java會根據參數類型和個數自動選擇對應的方法。例如:
OverloadDemo demo = new OverloadDemo(); demo.test(1); // 調用方法1 demo.test(1, 2); // 調用方法2
重寫
public class Animal { public void move() { System.out.println("動物可以移動"); } } public class Dog extends Animal { public void move() { System.out.println("狗可以跑和走"); } }
Java中的重寫是指子類定義了一個與父類方法簽名完全相同的方法,并且子類方法的訪問修飾符不小于父類方法。當我們調用子類對象的該方法時,將執行子類方法而非父類方法。上面的代碼中,我們定義了一個Animal類和一個Dog類,Dog類繼承自Animal類并重寫了其move方法,使其可以輸出特有的文本。例如:
Dog dog = new Dog(); dog.move(); // 調用Dog類中的move方法,輸出“狗可以跑和走” Animal animal = new Animal(); animal.move(); // 調用Animal類中的move方法,輸出“動物可以移動”
異同點
雖然重寫和重載都可以實現代碼復用,但它們的使用場景和實現方式有很大的差異。以下是它們的異同點:
- 重載和重寫都可以發生在類中,但重載還可以發生在不同的類中。
- 重載通過方法名和參數列表的不同,來實現同一個方法名可以進行多次調用。
- 重寫通過繼承,在子類中使用與父類相同的方法名和參數列表,來實現子類可以重寫父類的方法。
- 重載是編譯期行為,因為編譯器根據方法的參數列表選擇對應的方法。而重寫是運行期行為,因為在運行時確定調用的是哪個方法。
- 重載的返回值類型可以不相同,而重寫的返回值類型必須相同或是其子類。
- 重載的方法訪問修飾符可以不相同,而重寫的方法訪問修飾符必須不小于父類方法。