1. 程式人生 > >重寫與過載的區別?過載的方法是否可以改變返回值的型別?

重寫與過載的區別?過載的方法是否可以改變返回值的型別?



首先看一段程式:

Java程式碼 複製程式碼 收藏程式碼
  1. package testOverLoadandoverRide;  
  2. publicclass A extends B{  
  3.     //下面的是方法的覆蓋(overRiding)
  4.     publicvoid riding(){  
  5.         System.out.println("this is  overRiding ");  
  6.     }  
  7.     //下面兩個函式是方法的過載(overLoading),但是返回值型別不同,可以執行
  8.     public String loading(int x){  
  9.         System.out.println("this is overLoading return String"
    );  
  10.         returnnull;  
  11.     }  
  12.     publicint loading(int x,int y){  
  13.         System.out.println("this is overLoading return int");  
  14.         return0;  
  15.     }  
  16.     publicstaticvoid main(String[] args) {  
  17.          A a = new A();  
  18.          a.riding();  
  19.          a.loading(2);  
  20.          a.loading(2,3);  
  21.     }  
  22. }  
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);
	}
}
Java程式碼 複製程式碼 收藏程式碼
  1. class B{  
  2.     publicvoid riding(){  
  3.         System.out.println("this is B");  
  4.     }  
  5. }  
class B{
	public void riding(){
		System.out.println("this is B");
	}
}

下面是執行結果:

Java程式碼 複製程式碼 收藏程式碼
  1. this is  overRiding   
  2. this is overLoading return String  
  3. this is overLoading returnint
this is  overRiding 
this is overLoading return String
this is overLoading return int

有以上程式可以知道,方法的過載是可以改變返回值型別的,但是尚不能說明方法的覆蓋是否可以改變返回值型別,現在修改A類中 riding()方法的返回值型別為int.

Java程式碼 複製程式碼 收藏程式碼
  1. publicint riding(){  
  2.         System.out.println("this is  overRiding ");  
  3.     }  
public int riding(){
		System.out.println("this is  overRiding ");
	}

 此時會有如下的錯誤:

由此可知,方法的覆蓋是不允許修改返回值型別的。

以上測試程式執行在JDK1.5版本。

我對此的解釋為:

方法的過載是根據函式的引數列表來決定的,即:引數列表的個數,型別,順序三個方面;

對於其返回值型別,就是改變了也不會有影響,因為你不可能寫成引數類表相同(個數,型別,順序)的方法過載,因為那根不就不是過載。所以返回值型別也就不能作為程式執行時選擇函式的一個標準,因此返回值型別也就沒了對函式選擇時的影響。

方法的覆蓋不僅根據函式的引數列表還要根據返回值型別,因為覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;

覆蓋時還有“型別的提升”這一點,具體可以參考

總結如下:

重寫方法必須滿足下列條件
(1) 子類的方法的名稱及引數必須和所覆蓋的方法相同
(2) 子類的方法返回型別必須和所覆蓋的方法相同

(3) 子類方法不能縮小所覆蓋方法的訪問許可權
(4) 子類方法不能丟擲比所覆蓋方法更多的異常

過載方法必須滿足下列條件
(1) 方法名必須相同
(2) 方法的引數簽名必須相同
(3) 方法的返回型別和方法的修飾符可以不相同