【发布时间】:2016-10-21 22:51:10
【问题描述】:
由于静态函数属于一个类,它们是被继承的,但不是被覆盖的,只是被隐藏了。从下面的代码看来,B 中的 woof 方法似乎只有在父方法也有“throws IOException”声明的情况下才能有“抛出 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");
}
【问题讨论】:
-
值得注意的是,编译器说“重写的方法不会抛出IOException”而不是“隐藏的方法不会抛出IOException”。
-
你可以重写一个异常比超类的方法少的方法,但是你不能引入新的。查找Liskov Substitution Principle
-
@MadMatts LSP 适用于子类型;这不是子类型。
-
这可能与您可以在对象而不是类上调用静态方法这一事实有关。
-
@AndyTurner 如果这是可能的并且你有
A a = new B(); ((B)a).woof();,你会得到一个IOException,而你不会用a.woof()。这不违反原则吗?
标签: java inheritance static