一、引言
在JAVA編程中,方法重載和重寫是兩個重要的概念。雖然它們看起來類似,但是它們的語法和語義都有很大的區別。簡單來說,方法重載是在一個類中,有多個相同名稱的方法,但參數列表不同,以實現不同的功能。而方法重寫是在子類中重新定義父類中已有的方法,以實現對該方法的修改或擴展。在該文章中,我們將從多個角度詳細介紹JAVA方法重載和重寫的區別。
二、JAVA方法重載和重寫的區別
1. JAVA重載和重寫的區別
JAVA中,方法重載(Overloading)和方法重寫(Overriding)常常會被混淆。儘管兩者都涉及方法的命名,但實際上它們具有截然不同的含義。
方法重載產生於同一個類中,它們具有相同的函數名稱,但是參數數量或類型不同。例如:
public class Calculator { public int add(int x, int y) { return x + y; } public int add(int x, int y, int z) { return x + y + z; } }
上述代碼中,我們定義了一個名為“Calculator”的類。其中有兩個具有相同名稱的方法“add”,但是它們具有不同的參數數量。當我們按照不同的參數數量進行方法調用時,編譯器會自動選擇與調用參數類型最匹配的重載方法。
方法重寫,也叫覆蓋,是指子類重新定義了一個在父類中已有的方法,以覆蓋父類中原有的方法實現。例如:
public class Animal { public void move() { System.out.println("Animals can move"); } } public class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } }
上述代碼中,我們定義了一個名為“Animal”的類,其中具有一個名為“move”的方法。我們還定義了一個名為“Dog”的類,它繼承自“Animal”,並且重新定義了“move”方法的實現。儘管兩者具有相同的方法名稱,但其語意和實現卻是不同的。
2. JAVA中方法重寫的實現原則
當我們重新定義一個父類中已有的方法時,必須遵循以下三條原則:
2.1)方法的名稱、參數數量和類型必須與父類中要被重寫的方法相同。
public class Animal { public void eat() { System.out.println("Animal is eating"); } } public class Dog extends Animal { public void eat() { // eat 方法重新定義 System.out.println("Dog is eating"); } }
上述代碼中,我們重新定義了“Animal”類中的“eat”方法。子類中重寫的方法名稱、參數數量和類型必須與父類中的方法完全一致。
2.2)方法的訪問修飾符“不能優於”父類中被重寫的方法。
訪問修飾符的優先級從大到小依次是:private、缺省、protected、public。如果我們在子類中嘗試用一個訪問修飾符“優於”它父類中的被重寫方法的訪問修飾符,那麼編譯器就會報錯。
public class Animal { protected void sound() { System.out.println("Animal is making a sound"); } } public class Dog extends Animal { public void sound() { System.out.println("Dog is barking"); // error: attempting to assign weaker access privileges; was protected } }
上述代碼中,在“Animal”類中,我們定義了一個受保護的“sound”方法。在“Dog”類中,我們試圖將其訪問修飾符改為“公共”,這是行不通的。因此,我們必須將其修飾符改為“protected”。
2.3)方法的返回類型必須與父類中被重寫的方法“相同”或“是它的子類”。
public class Animal { public Object getChild() { return new Animal(); // 返回一個 Animal 對象 } } public class Dog extends Animal { public Dog getChild() { // 返回一個 Dog 對象 return new Dog(); } }
上述代碼中,在“Animal”類中,我們定義了一個名為“getChild”的方法,它返回一個Animal對象,並且在“Dog”類中重新定義了它,使其返回一個Dog對象。由於Dog是Animal的子類,因此我們可以將其返回類型定義為Dog。這裡我們僅以這種方式將其“擴展”為例,特別需要注意的是,本原素類型並不是一個子類,所以我們不能將其返回類型定義為原來方法的本原素類型。
3. JAVA中方法重載和重寫的區別
3.1)方法重載和方法重寫的區別
方法重載和方法重寫最大的區別是,方法重載發生在同一類中,而方法重寫發生在子類和父類之間。此外,方法重載是為了實現“多樣”的操作,而方法重寫是為了實現“多態”的操作。
3.2)參數的不同
方法重載是指同一個類中定義多個名稱相同但形參不同的方法,形參包括形參類型、形參個數和形參順序。
public class Calculator { public int add(int x, int y) { return x + y; } public int add(int x, int y, int z) { return x + y + z; } }
上述代碼中,我們定義了兩個名稱相同的方法,但參數列表不同。這樣,我們就可以在方法調用時,根據不同的參數調用不同的方法。
方法重寫,是指子類定義一個與父類同名、同參數、同返回類型的方法,來覆蓋父類的方法。
public class Animal { public void move() { System.out.println("Animals can move"); } } public class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } }
上述代碼中,我們在子類“Dog”中重新定義了父類“Animal”的“move”方法。最終的行為結果是,當我們使用“Dog”對象調用“move”方法時,將會運行子類中定義的方法而不是父類中定義的方法。
3.3)返回類型的不同
在方法重載中,方法必須具有相同的方法名稱和不同的參數列表,但返回類型可以是任意類型,包括基礎類型和對象類型。
而在方法重寫中,方法必須具有相同的方法名稱和參數列表,並且返回類型必須“相同”或是“子類”。這是因為返回類型涉及到繼承的概念,我們必須確保方法返回的類型是合法的,即子類可以擴展給定實例(父類)的語意。如果返回類型是不同的,則該方法被視為重載而不是重寫。
3.4)訪問修飾符的不同
方法重載和方法重寫中訪問修飾符的使用是不同的。
在方法重載中,方法可以具有不同的訪問修飾符,但必須在同一類中。這是因為方法重載只涉及到同一類的語意和約定,所以不需要繼承(或子類擴展)的概念。
而在方法重寫中,子類必須使重寫方法的訪問修飾符“不小於”父類的訪問修飾符。這是因為子類繼承了父類的所有特性,包括其訪問修飾符設置。如果重寫方法的訪問修飾符小於父類的訪問修飾符,那麼該方法只能通過父類調用並隱式繼承其訪問修飾符。
結論
在JAVA編程中,方法重載和重寫是兩個重要的概念,它們雖然看起來類似,但是它們的語法和語義都有很大的區別。方法重載是在同一個類中,有多個相同名稱的方法,但參數列表不同,以實現不同的功能。而方法重寫是在子類中重新定義父類中已有的方法,以實現對該方法的修改或擴展。在實際編程中,快速理解和正確運用這兩個概念是非常重要的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/250910.html