我的Parent课是:
Parent
import java.io.IOException; public class Parent { int x = 0; public int getX() throws IOException{ if(x<=0){ throw new IOException(); } return x; } }
我在extend这个类中写一个子类Child:
extend
Child
public class Child1 extends Parent{ public int getX(){ return x+10; } }
注意在 覆盖类中 的 getX 方法时Child,我已经throws从方法定义中删除了该子句,现在它导致编译器出现异常行为,这是预期的:
throws
new Parent().getX() ;
不会try-catch如预期那样将其封闭在一个块中而无法编译。
try-catch
new Child().getX() ;
编译而不将它封闭在一个try-catch块中。
但是下面的代码行需要try-catch块。
Parent p = new Child(); p.getX();
就像可以预见的那样,即在运行时多态期间使用父类引用来调用子方法,为什么Java的设计人员在覆盖特定的父类方法时没有强制要求在方法定义中包括throws子句?我的意思是,如果父类方法的定义中包含throws子句,则在覆盖它时,覆盖方法还应包含throws子句,不是吗?
不,这是适当的-一个重写的方法可以更加严格的关于它抛出什么(返回),因为这可以为呼叫者谁有用 知道 在编译的时候,他们将采用覆盖的方法,不希望打扰与不可能发生的异常等,具有了更多限制,而不是更 宽松 了,所以它不能惊喜呼叫者谁 做 通过父声明访问它。
通过类型引用使用重写方法Parent永远不会违反“可能抛出IOException” 的约定-缺少异常不会违反约定。反之(如果父母 没有 声明例外,但重写方法确实声明了例外) 将 违反合同。
IOException