Java方法重寫


如果子類中具有與父類別中宣告相同的方法,在java中稱為方法覆蓋。換句話說,如果子類提供了由其父類別提供的其中一個方法的特定實現,則它被稱為方法覆蓋。所以方法覆蓋有兩個前提條件:繼承和子父類別中方法名稱相同。

Java方法覆蓋的用法

  • 方法重寫用於提供有別於超類提供的方法的特定實現。
  • 方法重寫用於執行時多型性。

Java方法覆蓋的規則

  1. 方法必須與父類別中的名稱相同。
  2. 方法必須具有與父類別中相同的引數。
  3. 必須是IS-A關係(繼承)。

理解沒有方法覆蓋的問題

下面讓我們來了解如果在程式中不使用方法覆蓋可能面臨的問題。

class Vehicle {
    void run() {
        System.out.println("Vehicle is running");
    }
}

class Bike extends Vehicle {

    public static void main(String args[]) {
        Bike obj = new Bike();
        obj.run();
    }
}

執行上面程式碼,輸出結果如下 -

Vehicle is running

問題是,必須在子類中提供一個run()方法,這就是為什麼要使用方法覆蓋。

方法覆蓋的範例

在下面的這個例子中,在父類別中和子類中都定義了run方法,但子類中有一些特定的實現。 方法的名稱和引數是相同的,並且類之間有IS-A關係,因此這裡run方法被覆蓋了。

class Vehicle {
    void run() {
        System.out.println("Vehicle is running");
    }
}

class Bike2 extends Vehicle {
    void run() {
        System.out.println("Bike is running safely");
    }

    public static void main(String args[]) {
        Bike2 obj = new Bike2();
        obj.run();
    }
}

執行輸出結果如下 -

Bike is running safely

Java方法重寫的範例

考慮下面一個真實應用的情況,Bank是一個提供獲取利率的功能的類。 但是,利息率因銀行不同而有所區別。 例如,SBIICICIAXIS銀行可以提供8%7%9%的利率。

class Bank {
    int getRateOfInterest() {
        return 0;
    }
}

class SBI extends Bank {
    int getRateOfInterest() {
        return 8;
    }
}

class ICICI extends Bank {
    int getRateOfInterest() {
        return 7;
    }
}

class AXIS extends Bank {
    int getRateOfInterest() {
        return 9;
    }
}

class Test2 {
    public static void main(String args[]) {
        SBI s = new SBI();
        ICICI i = new ICICI();
        AXIS a = new AXIS();
        System.out.println("SBI Rate of Interest: " + s.getRateOfInterest());
        System.out.println("ICICI Rate of Interest: " + i.getRateOfInterest());
        System.out.println("AXIS Rate of Interest: " + a.getRateOfInterest());
    }
}

執行輸出結果如下 -

SBI Rate of Interest: 8
ICICI Rate of Interest: 7
AXIS Rate of Interest: 9

問題:可以覆蓋靜態方法嗎?

答: 這是不可以的,靜態方法不能被覆蓋。可以通過執行時多型來證明不能覆蓋,在稍後章節中將學習它。

問題: 為什麼不能覆蓋靜態方法?
答: 因為靜態方法是系結類,而範例方法系結物件。 靜態屬於類區域,範例屬於堆區域。

問題:可以重寫java main方法嗎?

答: 這是不可以的,因為main是一個靜態方法。

java方法過載和方法重寫之間的區別: