① 父类被重写的方法与子类重写的方法的方法名和形参列表必须相同。
② 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
- > 子类不能重写父类中声明为private权限修饰的方法。
③ 关于返回值类型:
- > 父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型必须是void
- > 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须与被重写的方法的返回值类型相同。
- > 父类被重写的方法的返回值类型是引用数据类型(比如类),则子类重写的方法的返回值类型可以与被重写的方法的返回值类型相同 或 是被重写的方法的返回值类型的子类
- > 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须与被重写的方法的返回值类型相同。
④ 子类重写的方法抛出的异常类型可以与父类被重写的方法抛出的异常类型相同,或是父类被重写的方法抛出的异常类型的子类。 (只针对编译时异常)
此外:子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法
public class OverrideTest {
public static void main(String[] args) {
Father f = new Son();
try{
// 进行方法调用 :多态编译看左边,运行看右边。所以catch捕获IOException
// 运行时看右边,如果Son抛出的异常比父类还大那么catch就捕获不到了。
// 所以 子类从写的方法抛出的异常只可以小于等于 父类方法抛出的异常
f.method1();
}catch(IOException e){
e.printStackTrace();
}
//父类返回的是number,执行为子类执行的方法。返回值类型为子类。就相当于多态
Number number = f.method4();
}
}
class Son extends Father{
// 抛出的异常是父类的子类
public void method1() throws FileNotFoundException {
}
// 子类方法抛出的异常不能大于父类被重写方法的异常
// public void method2() throws FileNotFoundException{
// }
// 子类可以抛出运行时异常,因为运行时类型,编译时写不写都可以。没什么影响
public void method3() throws RuntimeException{
}
// 子类方法返回值类型可以为父类的子类
public Integer method4(){
return null;
}
}
class Father{
public void method1() throws IOException {
}
public void method2(){
}
public void method3(){
}
public Number method4(){
return null;
}
}