由于静态函数属于一个类,因此它们是继承的,但不会被覆盖,只是隐藏。从下面的代码中可以看出,如果父方法也有,那么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");
}
答案 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)的类型参数,编译时未选中 警告发生。