Java 中的方法過載
如果你正在學習 Java 程式設計,你可能聽說過方法過載。我們將在本文中介紹 Java 中的方法過載。
Java 中的方法過載介紹
可以使用各種術語來替代方法過載。我們可以將方法過載稱為函式過載、靜態多型性或編譯時多型性,因此如果你聽說其中任何一個,請不要感到困惑,因為它們都是相同的。
有許多具有相同名稱但輸入引數、輸入引數型別或兩者不同的函式/方法,稱為方法過載/函式過載。這些函式/方法稱為過載方法或過載函式。
在 Java 中使用方法過載的優缺點
下面列出了方法過載的優點。
- 它提高了程式碼的可讀性和清潔度。
- 靈活呼叫各種同名不同引數的方法。
- 我們還可以為每個同名的函式設定不同的返回型別。
以下是方法過載的缺點。
- 對於一個絕對的初學者來說,理解方法過載的技巧有點棘手。
- 在設計和最終確定引數的數量及其資料型別方面需要更多的努力。
在 Java 中使用方法過載
假設你有一個計算不同形狀面積的應用程式,例如,圓形的面積和三角形的面積。
我們知道引數的數量、它們的資料型別以及所有形狀的公式。因此,我們可以為這種情況定義過載函式。
以下是用於計算具有相同函式名稱但輸入引數數量不同的形狀的面積的函式定義:
double calcAreaOfShape(double radius); // area of a circle
double calcAreaOfShape(double base, double height); // area of a triangle
第二個例子是關於新增不同的數字。這次我們可以有一個或多個具有不同資料型別的輸入引數。
int add(int num1, int num2);
float add(float num1, float num2, float num3);
/*Remember, the return type can't differ from the data type of
input parameters of the same function.*/
int add(float num1, float num2); // it is invalid
當我們有這樣的要求時,函式過載的概念也很有用,比如可以根據在輸入引數中傳遞一系列資料型別來呼叫函式。請參閱以下函式定義:
void display(String fullname, int age);
void display(int age, String fullname);
讓我們一一實現所有這些場景。下面是在 Java 中使用方法過載的示例。
原始碼:
public class Main {
public static void calcAreaOfShape(double radius) {
System.out.println("The Area of a Circle is " + (3.14 * radius * radius));
}
public static void calcAreaOfShape(double base, double height) {
System.out.println("The Area of a Triangle is " + (0.5 * base * height));
}
public static void main(String[] args) {
calcAreaOfShape(5.0);
calcAreaOfShape(3.0, 3.0);
}
}
輸出:
The Area of a Circle is 78.5
The Area of a Triangle is 4.5
我們在主函式中呼叫了兩次 calcAreaOfShape()
方法。第一個用於帶有一個輸入引數的圓,第二個用於通過傳遞兩個輸入引數來計算三角形面積。
我們還想計算一個帶有兩個引數(length
和 width
)的矩形的面積。有兩種方法可以做到這一點。
第一種方法是傳遞 String
型別的第三個引數,該引數告訴它是為矩形還是三角形呼叫。請記住,你必須將函式簽名從兩個輸入引數更新為三個輸入引數(參見以下程式碼段)。
原始碼:
public class Main {
public static void calcAreaOfShape(double radius) {
System.out.println("The Area of a Circle is " + (3.14 * radius * radius));
}
public static void calcAreaOfShape(double a, double b, String shapeName) {
if (shapeName == "triangle")
System.out.println("The Area of a Triangle is " + (0.5 * a * b));
else if (shapeName == "rectangle")
System.out.println("The Area of a Rectangle is " + (a * b));
else
System.out.println("Wrong Shape is Passed");
}
public static void main(String[] args) {
calcAreaOfShape(5.0);
calcAreaOfShape(3.0, 3.0, "triangle");
calcAreaOfShape(4.0, 2.0, "rectangle");
}
}
輸出:
The Area of a Circle is 78.5
The Area of a Triangle is 4.5
The Area of a Rectangle is 8.0
上面的程式碼執行良好,但存在一些問題。第一個問題是當三角形呼叫時變數名應該是 base
和 height
,而矩形需要 length
和 width
。
我們已將變數名稱更改為 a
和 b
以同時使用它們(矩形和三角形),但我們正在失去程式碼的可讀性和可理解性。
第二個問題是編寫多個 if-else
條件來處理所有情況,因為使用者可以輸入 rectangle
、Rectangle
或 RECTANGLE
。
為了解決所有這些限制並採用專業的方法,對於這種使用 instanceOf
檢查呼叫哪個物件的情況,我們更喜歡函式覆蓋。
原始碼(具有不同數量的輸入引數和資料型別的函式):
public class Main {
public static int add(int num1, int num2) {
return num1 + num2;
}
public static double add(double num1, double num2, double num3) {
return (num1 + num2 + num3);
}
public static void main(String[] args) {
System.out.println("The sum of two numbers is " + add(2, 3));
System.out.println("The sum of three numbers is " + add(2.0, 2.0, 2.0));
}
}
輸出:
The sum of two numbers is 5
The sum of three numbers is 6.0
我們在這裡使用函式過載來處理許多輸入引數和各種資料型別。
原始碼(具有輸入引數資料型別序列的函式):
public class Main {
public static void display(String fullname, int age) {
System.out.println("I am " + fullname + ", I am " + age + " years old");
}
public static void display(int age, String fullname) {
System.out.println("I am " + age + ", how old are you, " + fullname + "?");
}
public static void main(String[] args) {
display("Thomas Christopher", 34);
display(45, "John");
}
}
輸出:
I am Thomas Christopher, I am 34 years old
I am 45, how old are you, John?
在上面的例子中,我們使用函式過載來處理輸入引數的順序。