重写与重载的区别?重载的方法是否可以改变返回值的类型?



首先看一段程序:

Java代码 复制代码  收藏代码
  1. package testOverLoadandoverRide;  
  2.   
  3.   
  4. public class A extends B{  
  5.     //下面的是方法的覆盖(overRiding)  
  6.     public void riding(){  
  7.         System.out.println("this is  overRiding ");  
  8.     }  
  9.     //下面两个函数是方法的重载(overLoading),但是返回值类型不同,可以运行  
  10.     public String loading(int x){  
  11.         System.out.println("this is overLoading return String");  
  12.         return null;  
  13.     }  
  14.     public int loading(int x,int y){  
  15.         System.out.println("this is overLoading return int");  
  16.         return 0;  
  17.     }  
  18.     public static void main(String[] args) {  
  19.          A a = new A();  
  20.          a.riding();  
  21.          a.loading(2);  
  22.          a.loading(2,3);  
  23.     }  
  24. }  

 

Java代码 复制代码  收藏代码
  1. class B{  
  2.     public void riding(){  
  3.         System.out.println("this is B");  
  4.     }  
  5. }  

下面是运行结果:

Java代码 复制代码  收藏代码
  1. this is  overRiding   
  2. this is overLoading return String  
  3. this is overLoading return int  

有以上程序可以知道,方法的重载是可以改变返回值类型的,但是尚不能说明方法的覆盖是否可以改变返回值类型,现在修改A类中 riding()方法的返回值类型为int.

Java代码 复制代码  收藏代码
  1. public int riding(){  
  2.         System.out.println("this is  overRiding ");  
  3.     }  

 此时会有如下的错误:

由此可知,方法的覆盖是不允许修改返回值类型的。

以上测试程序运行在JDK1.5版本。

我对此的解释为:

方法的重载是根据函数的参数列表来决定的,即:参数列表的个数,类型,顺序三个方面;

对于其返回值类型,就是改变了也不会有影响,因为你不可能写成参数类表相同(个数,类型,顺序)的方法重载,因为那根不就不是重载。所以返回值类型也就不能作为程序运行时选择函数的一个标准,因此返回值类型也就没了对函数选择时的影响。

方法的覆盖不仅根据函数的参数列表还要根据返回值类型,因为覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

覆盖时还有“类型的提升”这一点,具体可以参考

http://topic.csdn.net/u/20110318/16/0acfac41-4ce4-4a1e-b3e3-9b4af265c691.html

总结如下:

重写方法必须满足下列条件
(1) 子类的方法的名称及参数必须和所覆盖的方法相同
(2) 子类的方法返回类型必须和所覆盖的方法相同

(3) 子类方法不能缩小所覆盖方法的访问权限
(4) 子类方法不能抛出比所覆盖方法更多的异常

重载方法必须满足下列条件
(1) 方法名必须相同
(2) 方法的参数签名必须相同
(3) 方法的返回类型和方法的修饰符可以不相同

你可能感兴趣的:(java)