覆写(重写)必须满足的条件:
- 重写方法不能缩小访问权限
- 参数列表必须与被重写方法相同
- 返回类型必须与被重写方法的相同或是其字类
- 重写方法不能抛出新的异常,或者超出父类范围的异常,但是可以抛出更少、更有限的异常,或者不抛出异常。
public class Client {
public static void main(String[] args) {
//向上转型 形参列表由父类决定
//在编译时。"base.fun(100,50)中的50这个实参会被编译器“猜测”而编译成{50}数组"再由子类sub.fun执行
Base base=new Sub();
base.fun(100,50);
//不转型
Sub sub=new Sub();
//调用的是子类的fun方法 ,50这里编译报错
//cannot be applied
/*这里编译器并不会把50转换成数组,因为数组本身就是一个对象,编译器并不会聪明到把两个没有
继承关系的类之间做转换,Java严格要求类型匹配的,类型不匹配编译器自然就会拒绝执行*/
sub.fun(100,50);
}
}
class Base{
void fun(int price,int...discounts){
System.out.println("基类的fun方法");
}
}
class Sub extends Base{
/**
* 重写的时候不会报错
* @param price
* @param discounts
*/
@Override
void fun(int price, int[] discounts) {
System.out.println("子类的fun方法");
}
}
该代码会编译不通过,在直接调用字类的fun方法的时候 sub.fun(100,50);这里重写是正确的,并不会报错,这是一个特例,覆写的方法列表竟然与父类不同,违背了覆写的定义,并且引发莫名奇妙的错误,所以变长方法覆写时,需要注意,覆写方法不仅参数与父类相同,类型、数量,还要包括显示形式。