更新時間:2023-03-23 來源:黑馬程序員 瀏覽量:
在面向對象編程中,"Overload"和"Override"是兩個重要的概念,用于描述不同類型的函數重寫。
Overload是指在同一類中定義了多個同名的方法,但每個方法具有不同的參數列表。Java會根據傳遞的參數類型和數量來確定哪個方法應該被調用。
例如,在下面的示例中,有兩個具有相同名稱的方法 "print", 但是它們接收的參數類型不同:
public class MyClass { public void print(int x) { System.out.println("The integer value is " + x); } public void print(String x) { System.out.println("The string value is " + x); } }
在這個示例中,如果你調用print(10),它會調用第一個方法,如果你調用print("Hello"),它會調用第二個方法。
Override是指在子類中重新定義了父類中已經定義的方法。這個方法必須有相同的名稱、參數列表和返回類型。在這種情況下,當你在子類中調用該方法時,將調用子類中的版本而不是父類中的版本。
例如,在下面的示例中,有一個父類 "Animal",其中有一個名為 "makeSound()" 的方法。然后有一個子類 "Dog",該子類重新定義了 "makeSound()" 方法:
class Animal { public void makeSound() { System.out.println("Animal is making a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Woof"); } }
在這個示例中,如果你創建了一個"Dog"對象,并調用makeSound()方法,它將打印出"Woof",而不是 "Animal is making a sound"。
下面是完整的示例代碼,展示了 Overload 和 Override 的區別:
public class MyClass { public static void main(String[] args) { // Overload 示例 MyClass myClass = new MyClass(); myClass.print(10); myClass.print("Hello"); // Override 示例 Animal animal = new Animal(); animal.makeSound(); Dog dog = new Dog(); dog.makeSound(); } // Overload 示例 public void print(int x) { System.out.println("The integer value is " + x); } public void print(String x) { System.out.println("The string value is " + x); } } class Animal { public void makeSound() { System.out.println("Animal is making a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Woof"); } }
運行代碼,將輸出以下內容:
The integer value is 10 The string value is Hello Animal is making a sound Woof
這證明了 Overload 和 Override 的區別。在 Overload 示例中,不同參數類型的方法可以共享相同的名稱。而在 Override 示例中,子類重寫了父類的方法,并且在調用該方法時將調用子類中的版本。
需要注意的是,Override只能在子類中重新定義方法。如果你嘗試在同一個類中重新定義方法,編譯器會報錯。另外,在Override中,子類方法必須具有與父類方法相同的返回類型。如果返回類型不同,編譯器將報錯。
但是,Overriding方法的返回類型必須與父類方法的返回類型相同或是其子類型。這是因為在運行時,Java虛擬機會根據方法的返回類型來確定需要分配多少內存來存儲返回值,如果返回類型不同,可能會導致類型轉換錯誤或其他運行時異常。
在Java中,Overloaded的方法可以改變返回值的類型,只要方法的簽名不同。方法的簽名是由方法名稱和參數列表組成的,如果兩個方法的名稱和參數列表不同,那么它們的返回值可以不同。
例如,假設有兩個方法:
public int sum(int a, int b) { return a + b; } public double sum(double a, double b) { return a + b; }
這兩個方法都叫做sum,但是它們的參數類型不同,一個是int類型,一個是double類型。由于它們的簽名不同,因此可以返回不同的類型。
當調用這些方法時,編譯器會根據參數的類型來選擇正確的方法。例如,如果調用sum(2, 3),則會調用第一個方法,返回int類型的結果5。如果調用sum(2.5, 3.5),則會調用第二個方法,返回double類型的結果6.0。
需要注意的是,如果兩個方法的簽名相同,但是返回值類型不同,那么編譯器將無法確定調用哪個方法,會導致編譯錯誤。因此,Overloaded的方法必須具有不同的簽名。