首先看一段程序:
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版本。
我對此的解釋為:
方法的重載是根據函數的參數列表來決定的,即:參數列表的個數,類型,順序三個方面;
對於其返回值類型,就是改變了也不會有影響,因為你不可能寫成參數類表相同(個數,類型,順序)的方法重載,因為那根不就不是重載。所以返回值類型也就不能作為程序運行時選擇函數的一個標准,因此返回值類型也就沒了對函數選擇時的影響。
方法的覆蓋不僅根據函數的參數列表還要根據返回值類型,因為覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;
覆蓋時還有“類型的提升”這一點,具體可以參考
http://topic.csdn.net/u/20110318/16/0acfac41-4ce4-4a1e-b3e3-9b4af265c691.html
總結如下:
方法覆蓋必須滿足下列條件
(1) 子類的方法的名稱及參數必須和所覆蓋的方法相同
(2) 子類的方法返回類型必須和所覆蓋的方法相同
重載方法必須滿足下列條件
(1) 方法名必須相同
(2) 方法的參數簽名必須相同 //這句話對嗎?????????
(3) 方法的返回類型和方法的修飾符可以不相同
###########################################################
1. public class A {
2. public void doit() {
3. }
4. public String doit() { //編譯不通過,因為:方法重載要求參數簽名必須不一致
5. return “a”;
6. }
7. public double doit(int x) {
8. return 1.0;
9. }
10.}
What is the result?
A. An exception is thrown at runtime.
B. Compilation fails because of an error in line 7.
C. Compilation fails because of an error in line 4.
D. Compilation succeeds and no runtime errors with class A occur.
Answer: C