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{
public void riding(){
System.out.println("this is B");
}
}
下面是執行結果:
this is overRiding
this is overLoading return String
this is overLoading return int
有以上程式可以知道,方法的過載是可以改變返回值型別的,但是尚不能說明方法的覆蓋是否可以改變返回值型別,現在修改A類中 riding()方法的返回值型別為int,
public int riding(){
System.out.println("this is overRiding ");
}
此時會有如下的錯誤:
由此可知,方法的覆蓋是不允許修改返回值型別的。
以上測試程式執行在JDK1.5版本。
我對此的解釋為:
方法的過載是根據函式的引數列表來決定的,即:引數列表的個數,型別,順序三個方面;
對於其返回值型別,就是改變了也不會有影響,因為你不可能寫成引數類表相同(個數,型別,順序)的方法過載,因為那根不就不是過載。所以返回值型別也就不能作為程式執行時選擇函式的一個標準,因此返回值型別也就沒了對函式選擇時的影響。
方法的覆蓋不僅根據函式的引數列表還要根據返回值型別,因為覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;
覆蓋時還有“型別的提升”這一點,具體可以參考
總結如下:
方法覆蓋必須滿足下列條件
(1) 子類的方法的名稱及引數必須和所覆蓋的方法相同
(2) 子類的方法返回型別必須和所覆蓋的方法相同
過載方法必須滿足下列條件
(1) 方法名必須相同
(2) 方法的引數簽名必須相同
(3) 方法的返回型別和方法的修飾符可以不相同