重載 (Overload)允許不同的方法有相同的名稱,但不同的簽名(signatures),其中簽名可以是不同的輸入參數數量或者不同的輸入參數類型。重載與編譯時(或靜态)多态相關。
// Java program to demonstrate working of method
// overloading in Java.
public class Sum {
// Overloaded sum(). This sum takes two int parameters
public int sum(int x, int y) {
return (x + y);
}
// Overloaded sum(). This sum takes three int parameters
public int sum(int x, int y, int z) {
return (x + y + z);
}
// Overloaded sum(). This sum takes two double parameters
public double sum(double x, double y) {
``` return (x + y);
}
// Driver code
public static void main(String args[]) {
Sum s = new Sum();
System.out.println(s.sum(10, 20));
System.out.println(s.sum(10, 20, 30));
System.out.println(s.sum(10.5, 20.5));
}
}
輸出:
30
60
31.0
多态的好處都有啥?
我們不必為了處理相同任務的方法起更多的名稱,類似于上面的代碼,我們不用起諸如 sumInt, sumDouble,...,sumInt3,...之類的各種名稱。
傳回值類型能否重載?
答案是 No,這點和 C++ 是相同的,例如:
public class Main {
public int foo() {
return 10;
}
// compiler error: foo() is already defined
public char foo() {
return 'a';
}
public static void main(String args[]) {
}
}
靜态方法能否重載?
答案是 Yes,一個類可以有多個名稱相同參數不同的靜态方法。可以參考詳情。
Main() 方法能否重載?
和靜态方法重載一樣,答案是可以的。
// A Java program with overloaded main()
import java.io.*;
public class Test {
// Normal main()
public static void main(String[] args) {
System.out.println("Hi Geek (from main)");
Test.main("Geek");
}
// Overloaded main methods
public static void main(String arg1) {
System.out.println("Hi, " + arg1);
Test.main("Dear Geek","My Geek");
}
public static void main(String arg1, String arg2) {
System.out.println("Hi, " + arg1 + ", " + arg2);
}
}
輸出:
Hi Geek (from main)
Hi, Geek
Hi, Dear Geek, My Geek
Java 是否允許操作符(Operator)重載?
與C++不同,Java 不允許自定義重載操作符。Java 内部允許重載操作符,如 + 被用于連接配接字元串。
重載(Overload)和重寫(Override)的差別?
重載是有相同功能的方法有不同的簽名,重寫兩個方法可能有相同的功能,相同的簽名,但是需要不同的類通過繼承連接配接。
OverridingVsOverloading.png
重載是編譯時多态,重寫是運作時多态。