更多 Java 基礎(chǔ)知識(shí)方面的文章,請(qǐng)參見文集《Java 基礎(chǔ)知識(shí)》
Method Overloading 方法重載
- 方法使用相同的名字翔悠,不同的參數(shù)
- 不能只改變返回值類型
- 目的:增加代碼可讀性
main 方法也可以重載港准,例如:
public class Main_Test {
// 只有這個(gè) main 方法會(huì)被 JVM 自動(dòng)執(zhí)行
public static void main(String[] args) {
main(123);
}
// 只有這個(gè) main 方法不會(huì)被 JVM 自動(dòng)執(zhí)行
// 相當(dāng)于一個(gè)普通的靜態(tài)方法,可以被調(diào)用
public static void main(int i) {
System.out.println(i);
}
}
Method Overiding 方法重寫
- 子類繼承父類,同樣的方法簽名凛篙,不同的方法實(shí)現(xiàn)
- 目的:運(yùn)行時(shí)綁定,運(yùn)行時(shí)多態(tài)
不能 Override 靜態(tài)方法栏渺,因?yàn)殪o態(tài)方法屬于類 Class呛梆,在 Class Area,是靜態(tài)綁定迈嘹,在編譯期決定削彬。
關(guān)于 Override 靜態(tài)方法,參見 Java 域隱藏 Field Hiding 及靜態(tài)方法隱藏 Method Hiding
Covariant Return Type
如果子類的方法與父類的方法擁有相同的方法名和參數(shù)秀仲,即使返回值類型不同(即方法簽名不同)融痛,但是如果子類方法返回值類型是父類方法返回值類型的子類型,也屬于Method Overiding 方法重寫神僵,屬于運(yùn)行時(shí)綁定雁刷,運(yùn)行時(shí)多態(tài)。
例如下面例子中:
Base 的方法 f() 與 Derived 的方法 f() 擁有相同的方法名和參數(shù)保礼,但是:
- 返回值類型不同沛励,一個(gè)是 Number责语,一個(gè)是 Integer,所以方法簽名不同
- 由于 Number 是 Integer 的父類目派,因此仍然屬于Method Overiding 方法重寫坤候,屬于運(yùn)行時(shí)綁定,運(yùn)行時(shí)多態(tài)企蹭。
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;
}
}