java的重寫
阿新 • • 發佈:2017-07-14
-name 改變 stat 聲明 body www header tor size
如果子類中具有與父類中聲明相同的方法,在java中稱為方法覆蓋。換句話說,如果子類提供了由其父類提供的其中一個方法的特定實現,則它被稱為方法覆蓋。所以方法覆蓋有兩個前提條件:繼承和子父類中方法名稱相同。
Java方法覆蓋的用法
- 方法重寫用於提供有別於超類提供的方法的特定實現。
- 方法重寫用於運行時多態性。
Java方法覆蓋的規則
- 方法必須與父類中的名稱相同。
- 方法必須具有與父類中相同的參數。
- 必須是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();
}
}
Java
執行上面代碼,輸出結果如下 -
Vehicle is running
Java
問題是,必須在子類中提供一個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();
}
}
Java
執行輸出結果如下 -
Bike is running safely
Java
Java方法重寫的實例
考慮下面一個真實應用的情況,Bank
是一個提供獲取利率的功能的類。 但是,利息率因銀行不同而有所區別。 例如,SBI
,ICICI
和AXIS
銀行可以提供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());
}
}
Java
執行輸出結果如下 -
SBI Rate of Interest: 8
ICICI Rate of Interest: 7
AXIS Rate of Interest: 9
Java
問題:可以覆蓋靜態方法嗎?
答: 這是不可以的,靜態方法不能被覆蓋。可以通過運行時多態來證明不能覆蓋,在稍後章節中將學習它。
問題: 為什麽不能覆蓋靜態方法?
答: 因為靜態方法是綁定類,而實例方法綁定對象。 靜態屬於類區域,實例屬於堆區域。
問題:可以重寫java main方法嗎?
答: 這是不可以的,因為main
是一個靜態方法。
java方法重載和方法重寫之間的區別:
- 方法重載和覆蓋的區別
- java中的方法重載和方法重寫有很多區別。 下面給出了方法重載和方法覆蓋之間的差異列表:
編號 | 方法重載 | 方法重寫 |
---|---|---|
1 | 方法重載用於提高程序的可讀性。 | 方法重寫用於提供已經由其超類提供的方法的特定實現。 |
2 | 方法重載在類內執行。 | 方法重寫發生在具有IS-A(繼承)關系的兩個類中。 |
3 | 在方法重載的情況下,參數必須不同。 | 在方法重寫的情況下,參數必須相同。 |
4 | 方法重載是編譯時多態性的例子。 | 方法重寫/覆蓋是運行時多態性的例子。 |
5 | 在java中,方法重載不能僅通過改變方法的返回類型來執行。方法重載中的返回類型可以相同或不同。 但是必須更改參數類型。 | 在方法重寫/覆蓋中返回類型必須相同或協變。 |
Java方法重載示例
class OverloadingExample {
static int add(int a, int b) {
return a + b;
}
static int add(int a, int b, int c) {
return a + b + c;
}
}
Java
Java方法覆蓋示例
class Animal {
void eat() {
System.out.println("eating...");
}
}
class Dog extends Animal {
void eat() {
System.out.println("eating bread...");
}
}
java的重寫