java中函数覆盖(即重写override),子类的返回类型一定要和父类一样吗?

分情况的,第一种情况:jdk1.4及之前的版本返回类型必须完全一样。第二种情况:jdk1.5及之后的版本,返回类型可以是父类返回类型的兼容类型。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

关于重写,遵循以下的规则(不变:参数列表、返回类型(类型可以是子类)):

(1)重写方法必须和被重写方法具有相同的参数列表(包括顺序及个数还有类型)返回类型必须和被重写方法的返回类型相同或者是返回类型的子类型。

(2)重写方法的访问控制修饰符不能比被重写方法更严格(比如一个在父类中声明为public的方法重写成一个protected的方法)。

(3)只有实例方法才能被重写,超类中的static和final方法不能被重写。

(4)重写方法不能抛出新的检查异常,或者是抛出比被重写方法声明的检查异常更广泛的检查异常。

(5)注意一种特殊情况:如果超类的方法版本中声明了检查异常,但重写的子类方法中没有声明,这时如果使用多态的方式进行调用,那么编译器认为你调用的是声明了异常的方法。

(6)尽管多态是在编译时确定对象的类型,但在编译时,还是根据父类的方法声明进行程序检查。因此,如果子类中定义的方法,在父类中没有定义,则会出项编译错误。

Java的重载机制(改变:参数列表):
重载的实质:在一个类中使用签名相同的多个方法。

按照范围,可以将重载分为在一个类中重载,和在子类和父类中重载。现分别解释如下:

1.在一个类中定义多个具有相同签名的方法,这些方法必须具有不同的参数列表,比如一个类的构造函数。

2.在父类和子类中,子类由于继承而拥有了父类的某些方法,此时在子类再定义具有相同签名的方法(必须具有不同的参数列表),这个地方很容易和重写相混淆,因此千万注意。

重载的规则主要记住亮点:
一是方法的参数列表必须改变,包括参数的类型,参数的个数多少,参数顺序

二是重载对返回类型,访问修饰符,异常声明没有任何限制,可以作任意的修改。实质上,重载只是创建了一个方法而已,特殊的地方在于方法的名字。

 

补充:java,方法名相同,参数列表相同,返回类型不同(类型不是子类),会出现什么状况?

答:会报错,这不是重写,也不是重载。

你可能感兴趣的:(JAVA,重写,重载)