如果子類中具有與父類中聲明相同的方法,在java中稱為方法覆蓋。換句話說,如果子類提供了由其父類提供的其中一個(gè)方法的特定實(shí)現(xiàn),則它被稱為方法覆蓋。所以方法覆蓋有兩個(gè)前提條件:繼承和子父類中方法名稱相同。
Java方法覆蓋的用法
Java方法覆蓋的規(guī)則
理解沒有方法覆蓋的問題
下面讓我們來了解如果在程序中不使用方法覆蓋可能面臨的問題。
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();
}
}
執(zhí)行上面代碼,輸出結(jié)果如下 -
Vehicle is running
問題是,必須在子類中提供一個(gè)run()
方法,這就是為什么要使用方法覆蓋。
在下面的這個(gè)例子中,在父類中和子類中都定義了run
方法,但子類中有一些特定的實(shí)現(xiàn)。 方法的名稱和參數(shù)是相同的,并且類之間有IS-A關(guān)系,因此這里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();
}
}
執(zhí)行輸出結(jié)果如下 -
Bike is running safely
考慮下面一個(gè)真實(shí)應(yīng)用的情況,Bank
是一個(gè)提供獲取利率的功能的類。 但是,利息率因銀行不同而有所區(qū)別。 例如,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());
}
}
執(zhí)行輸出結(jié)果如下 -
SBI Rate of Interest: 8
ICICI Rate of Interest: 7
AXIS Rate of Interest: 9
問題:可以覆蓋靜態(tài)方法嗎?
答: 這是不可以的,靜態(tài)方法不能被覆蓋??梢酝ㄟ^運(yùn)行時(shí)多態(tài)來證明不能覆蓋,在稍后章節(jié)中將學(xué)習(xí)它。
問題: 為什么不能覆蓋靜態(tài)方法?
答: 因?yàn)殪o態(tài)方法是綁定類,而實(shí)例方法綁定對(duì)象。 靜態(tài)屬于類區(qū)域,實(shí)例屬于堆區(qū)域。
問題:可以重寫java main方法嗎?
答: 這是不可以的,因?yàn)?code>main是一個(gè)靜態(tài)方法。
java方法重載和方法重寫之間的區(qū)別: