更多 Java 基礎知識方面的文章,請參見文集《Java 基礎知識》
Method Overloading 方法重載
- 方法使用相同的名字,不同的參數
- 不能只改變返回值類型
- 目的:增加代碼可讀性
main 方法也可以重載,例如:
public class Main_Test {
// 只有這個 main 方法會被 JVM 自動執行
public static void main(String[] args) {
main(123);
}
// 只有這個 main 方法不會被 JVM 自動執行
// 相當于一個普通的靜態方法,可以被調用
public static void main(int i) {
System.out.println(i);
}
}
Method Overiding 方法重寫
- 子類繼承父類,同樣的方法簽名,不同的方法實現
- 目的:運行時綁定,運行時多態
不能 Override 靜態方法,因為靜態方法屬于類 Class,在 Class Area,是靜態綁定,在編譯期決定。
關于 Override 靜態方法,參見 Java 域隱藏 Field Hiding 及靜態方法隱藏 Method Hiding
Covariant Return Type
如果子類的方法與父類的方法擁有相同的方法名和參數,即使返回值類型不同(即方法簽名不同),但是如果子類方法返回值類型是父類方法返回值類型的子類型,也屬于Method Overiding 方法重寫,屬于運行時綁定,運行時多態。
例如下面例子中:
Base 的方法 f() 與 Derived 的方法 f() 擁有相同的方法名和參數,但是:
- 返回值類型不同,一個是 Number,一個是 Integer,所以方法簽名不同
- 由于 Number 是 Integer 的父類,因此仍然屬于Method Overiding 方法重寫,屬于運行時綁定,運行時多態。
public class CovariantReturnType_Test {
public static void main(String[] args) {
Base b = new Derived();
b.f(); // 輸出Derived
}
}
class Base {
public Number f() {
System.out.println("Base");
return 1;
}
}
class Derived extends Base {
public Integer f() {
System.out.println("Derived");
return 1;
}
}