Java面向對象(OOP)概念
Java面向對象(OOP)概念
Java命名約定
Java對象和類
Java構造器(構造方法)
Java static關鍵字
Java this關鍵字
Java繼承
Java聚合
Java方法重載
Java方法重寫
Java super關鍵字
Java實例初始化程序塊
Java final關鍵字
Java多態
Java靜態綁定和動態綁定
Java instanceof運算符
Java抽象類
Java接口
Java抽象類和接口的區別
Java包
Java訪問修飾符
Java封裝
Java Object類
Java對象克隆
Java數組
Java包裝類
Java按值調用和引用調用
Java strictfp關鍵字
Java命令行參數
對象和類之間的區別
java中方法重載和方法重寫的區別
Java方法重寫
如果子類中具有與父類中聲明相同的方法,在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();
}
}
執行上面代碼,輸出結果如下 -
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
是一個提供獲取利率的功能的類。 但是,利息率因銀行不同而有所區別。 例如,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());
}
}
執行輸出結果如下 -
SBI Rate of Interest: 8
ICICI Rate of Interest: 7
AXIS Rate of Interest: 9
問題:可以覆蓋靜態方法嗎?
答: 這是不可以的,靜態方法不能被覆蓋。可以通過運行時多態來證明不能覆蓋,在稍後章節中將學習它。
問題: 爲什麼不能覆蓋靜態方法?
答: 因爲靜態方法是綁定類,而實例方法綁定對象。 靜態屬於類區域,實例屬於堆區域。
問題:可以重寫java main方法嗎?
答: 這是不可以的,因爲main
是一個靜態方法。
java方法重載和方法重寫之間的區別:
- 方法重載和覆蓋的區別