天天看點

教妹學Java(三十一):簡單了解 Java 中的方法重寫(Overriding)

三妹開學了,學的計算機軟體程式設計。她學校離我家很近,坐公共汽車也就 10 站路的距離, 每逢周末她都會來找我,讓我輔導她學習 Java。作為一名擁有十餘年程式設計經驗的程式員,再加上父母給我們的這份血緣關系,我覺得義不容辭。

“二哥,今天我們要學習的内容是‘方法重寫(Overriding)’,對吧?”看來三妹已經提前預習了我上次留給她的作業。

“是的,三妹。如果子類具有和父類一樣的方法(參數相同、傳回類型相同、方法名相同,但方法體可能不同),這被叫做方法重寫。 ”我面帶着樸實無華的微笑回答着她,“方法重寫用于提供其父類已經聲明的方法的特殊實作。方法重寫是實作多态的基礎條件。”

----正兒八經的分割線,正文開始------------

在 Java 中,方法重寫需要滿足以下三個規則:

重寫的方法必須和父類中的方法有着相同的名字;

重寫的方法必須和父類中的方法有着相同的參數;

必須是 is-a 的關系(繼承關系)。

如果沒有方法重寫,會有什麼問題呢?來看下面這個例子。

/**
 * @author 微信搜「沉默王二」,回複關鍵字 PDF
 */
public class Bike extends Vehicle {
    public static void main(String[] args) {
        Bike bike = new Bike();
        bike.run();
    }
}
class Vehicle {
    void run() {
        System.out.println("車輛在跑");
    }
}      

程式輸出結果如下所示:

車輛在跑

1

Bike is-a Vehicle,自行車是一種車,沒錯。Vehicle 類有一個 run() 的方法,也就是說車輛可以跑,Bike 繼承了 Vehicle,也可以跑。但如果 Bike 沒有重寫 run() 方法的話,自行車就隻能是“車輛在跑”,而不是“自行車在跑”,對吧?

如果有了方法重寫,一切就好辦了。

/**
 * @author 微信搜「沉默王二」,回複關鍵字 PDF
 */
public class Bike extends Vehicle {
    @Override
    void run() {
        System.out.println("自行車在跑");
    }
    public static void main(String[] args) {
        Bike bike = new Bike();
        bike.run();
    }
}
class Vehicle {
    void run() {
        System.out.println("車輛在跑");
    }
}      

自行車在跑

Bike 重寫了 run() 方法,也就意味着,Bike 可以跑出自己的風格。

注意,靜态方法是不能被重寫的,我們在學習運作時多态的時候會進一步說明。

“三妹,關于 Java 中的方法重寫,我們暫且先學到這裡吧。”我揉一揉犯困的雙眼,疲憊地給三妹說。

“好的,二哥,我這就去練習去。”三妹似乎意猶未盡,這種學習狀态真令我感到開心。