重寫與過載的區別?過載的方法是否可以改變返回值的型別?
阿新 • • 發佈:2019-01-02
首先看一段程式:
Java程式碼- package testOverLoadandoverRide;
- publicclass A extends B{
- //下面的是方法的覆蓋(overRiding)
- publicvoid riding(){
- System.out.println("this is overRiding ");
- }
- //下面兩個函式是方法的過載(overLoading),但是返回值型別不同,可以執行
- public String loading(int x){
- System.out.println("this is overLoading return String"
- returnnull;
- }
- publicint loading(int x,int y){
- System.out.println("this is overLoading return int");
- return0;
- }
- publicstaticvoid main(String[] args) {
- A a = new A();
- a.riding();
- a.loading(2);
- a.loading(2,3);
- }
- }
Java程式碼package testOverLoadandoverRide; public class A extends B{ //下面的是方法的覆蓋(overRiding) public void riding(){ System.out.println("this is overRiding "); } //下面兩個函式是方法的過載(overLoading),但是返回值型別不同,可以執行 public String loading(int x){ System.out.println("this is overLoading return String"); return null; } public int loading(int x,int y){ System.out.println("this is overLoading return int"); return 0; } public static void main(String[] args) { A a = new A(); a.riding(); a.loading(2); a.loading(2,3); } }
- class B{
- publicvoid riding(){
- System.out.println("this is B");
- }
- }
class B{
public void riding(){
System.out.println("this is B");
}
}
下面是執行結果:
Java程式碼- this is overRiding
- this is overLoading return String
- this is overLoading returnint
this is overRiding
this is overLoading return String
this is overLoading return int
有以上程式可以知道,方法的過載是可以改變返回值型別的,但是尚不能說明方法的覆蓋是否可以改變返回值型別,現在修改A類中 riding()方法的返回值型別為int.
Java程式碼- publicint riding(){
- System.out.println("this is overRiding ");
- }
public int riding(){
System.out.println("this is overRiding ");
}
此時會有如下的錯誤:
由此可知,方法的覆蓋是不允許修改返回值型別的。
以上測試程式執行在JDK1.5版本。
我對此的解釋為:
方法的過載是根據函式的引數列表來決定的,即:引數列表的個數,型別,順序三個方面;
對於其返回值型別,就是改變了也不會有影響,因為你不可能寫成引數類表相同(個數,型別,順序)的方法過載,因為那根不就不是過載。所以返回值型別也就不能作為程式執行時選擇函式的一個標準,因此返回值型別也就沒了對函式選擇時的影響。
方法的覆蓋不僅根據函式的引數列表還要根據返回值型別,因為覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;
覆蓋時還有“型別的提升”這一點,具體可以參考
總結如下:
重寫方法必須滿足下列條件
(1) 子類的方法的名稱及引數必須和所覆蓋的方法相同
(2) 子類的方法返回型別必須和所覆蓋的方法相同
(3) 子類方法不能縮小所覆蓋方法的訪問許可權
(4) 子類方法不能丟擲比所覆蓋方法更多的異常
過載方法必須滿足下列條件
(1) 方法名必須相同
(2) 方法的引數簽名必須相同
(3) 方法的返回型別和方法的修飾符可以不相同