Java中方法重寫和方法重載
一、方法重寫(Override)
在Java中如何來定義重寫:Java程序中類的繼承特性可以產生一個子類,子類繼承父類就擁有了父類的非私有的屬性(方法和變量),在子類中可以增加自己的屬性(方法和變量),同時也可以對父類中的方法進行擴展,以增強自己的功能,這樣就稱之為重寫,也稱為復寫或者覆蓋。所謂方法重寫就是子類的方法和父類中繼承下來的方法具有完全相同的方法名、返回值類型、方法的參數個數以及參數類型,這樣才能被稱為方法重寫。
代碼體現:
// 這是父類的定義
public class Person {
public void eat() {
System.out.println("=====這是父類Person的eat方法=======");
}
}
// 這是子類的定義
public class Student extends Person {
@Override
public void eat() {
System.out.println("===這是子類Student的eat方法===");
}
// main方法測試
public static void main(String[] args) {
Student student = new Student();
student.eat(); //輸出:===這是子類Student的eat方法===
}
}
子類重寫父類的方法後,在實例化子類的時候則調用的是子類中的方法,父類的方法就如同被覆蓋了一樣。如果在子類中需要調用父類的方法,則在子類方法中使用super關鍵字調用父類的方法,格式:super.父類中的方法名(參數列表)。
重寫規則:
在進行方法重寫的時候需要遵循以下規則才能實現方法重寫:
(一)子類方法的參數列表必須和父類中被重寫的方法的參數列表相同(參數個數和參數類型),否則只能實現方法的重載。
(二)子類方法的返回值類型必須和父類中被重寫的方法返回值類型相同,否則只能實現方法重載。
(三)在Java規定,子類方法的訪問權限不能比父類中被重寫的方法的訪問權限更小,必須大於或等於父類的訪問權限。
(四)在重寫的過程中,如果父類中被重寫的方法拋出異常,則子類中的方法也要拋出異常。但是拋出的異常也有一定的約束--->子類不能拋出比父類更多的異常,只能拋出比父類更小的異常,或者不拋出異常。例如:父類方法拋出Exception,那麽子類就只能拋出IOException或者拋出比Exception小的異常或者不拋出異常。
二、方法重載(Overload)
在Java中如何定義重載:在Java中通過在類中寫多個方法,這類方法的方法名相同,方法的參數列表不同(參數的個數和參數類型的不同)來事現方法的重載。所謂方法重載就是:在一個類中,有一系列的方法具有方法名相同,但參數列表不同,這類方法的現就是方法重載。註意構造方法也可以重載。
代碼體現:
// 這是父類的定義
public class Person {
/*
* protected void eat() throws Exception{
* System.out.println("=====這是父類Person的eat方法======="); }
*/
public Person() {
System.out.println("這是無參構造方法");
}
public Person(String name) {
System.out.println("這是有一個參數的構造方法參數name=" + name);
}
void print() {
System.out.println("====無參print方法====");
}
void print(String str) {
System.out.println("====有一個參數的print方法====");
}
void print(String str, int a) {
System.out.println("====有兩個參數的print方法====");
}
}
在對象調用這些方法的時候,Java VM會根據不同的參數列表來執行不同的方法體,這就是多態的一種體現。
重載規則:
在進行方法重載的時候需要遵循以下的規則:
(一)再使用方法重載的時候,必須通過方法中不同的參數列表來實現方法的重載。如:方法的參數個數不同或者方法的參數類型不同。
(二)不能通過訪問權限,返回值類型和拋出的異常來實現重載
(三)方法的異常類型和拋出異常的數目不會影響方法的重載,也就是說重載的方法中允許拋出不同的異常
(四)可以有不同的返回值類型,只要方法的參數列表不同即可
(五)可以有不同的訪問修飾符
三、重寫與重載的區別
區別點 |
重載 |
重寫(覆寫) |
英文 |
Overloading |
Overiding |
定義 |
方法名稱相同,參數的類型或個數不同 |
方法名稱、參數類型、返回值類型全部相同 |
對權限沒有要求 |
被重寫的方法不能擁有更嚴格的權限 |
|
範圍 |
發生在一個類中 |
發生在繼承類中 |
註意:構造方法不能被繼承,因此不能被重寫,在子類中只能通過super關鍵字調用父類的構造方法;但是可以被重載。
Java中方法重寫和方法重載