如果静态方法不能被覆盖,为什么它们必须满足父类中静态方法的异常抛出契约?

时间:2016-10-21 22:51:10

标签: java inheritance static

由于静态函数属于一个类,因此它们是继承的,但不会被覆盖,只是隐藏。从下面的代码中可以看出,如果父方法也有,那么B中的woof方法只能有一个“抛出IOException”声明。即,下面的代码给出了编译器错误,即throws子句与A.woof中的子句不兼容 如果没有覆盖该方法,为什么它必须满足异常合同?

class A {
    static void woof()  { //Compiles IF i add throws IOException here
        System.out.println("A's woof");
    }
}

class B extends A {
    static void woof() throws IOException {  //Compiler error
        System.out.println("B's woof");
    }

1 个答案:

答案 0 :(得分:1)

此行为已在JLS规范中捕获。看起来编译器会以相同的方式处理覆盖和隐藏方法。

  

更确切地说,假设B是类或接口,A是a   B的超类或超接口,以及B中的方法声明m2   覆盖或隐藏A中的方法声明m1。然后:

     

如果m2有   提到任何已检查的异常类型的throws子句,然后m1必须   有一个throws子句,或发生编译时错误。

     

每一个人   检查m2的throws子句中列出的异常类型,同样如此   异常类或其超类型之一必须在擦除中出现   m1的throws条款的(§4.6);否则,编译时错误   发生。

     

如果m1的未删除的throws子句不包含   m2的throws子句中每个异常类型的超类型(改编,   如果需要,对于m1)的类型参数,编译时未选中   警告发生。