继承,方法签名,方法重写和throws子句

NIN*_*OOP 16 java polymorphism inheritance overriding throws

我的Parent班级是:

import java.io.IOException;
public class Parent {
        int x = 0;
        public int getX() throws IOException{
        if(x<=0){
         throw new IOException();
        }
       return x;
      }
 }
Run Code Online (Sandbox Code Playgroud)

extend这个类写一个子类Child:

public class Child1 extends Parent{
     public int getX(){
        return x+10;
   }
}
Run Code Online (Sandbox Code Playgroud)

注意在覆盖类中getX方法时Child,我已从throws方法定义中删除了该子句.现在,它会导致编译器出现异常行为,这是预期的:

new Parent().getX() ;
Run Code Online (Sandbox Code Playgroud)

如果不try-catch按预期将其封闭在块中,则不会进行编译.

new Child().getX() ;
Run Code Online (Sandbox Code Playgroud)

编译而不将其封闭在一个try-catch块中.

但是下面的代码行需要try-catch块.

Parent p = new Child();
p.getX();
Run Code Online (Sandbox Code Playgroud)

正如可以预见的那样,即在运行时多态性期间使用父类引用来调用子方法,为什么Java的设计者没有强制要求在覆盖特定父类方法时在方法定义中包含throws子句?我的意思是如果父类方法在其定义中有throws子句,那么在覆盖它时,重写方法还应该包括throws子句,不是吗?

Jon*_*eet 33

不,这是适当的-一个重写的方法可以更加严格的关于它抛出什么(返回),因为这可以为呼叫者谁有用知道,他们将使用重载方法在编译的时候,不希望打扰与不可能发生的异常等,具有了更多限制,而不是更宽松的,所以它不能带来惊喜谁呼叫者通过父声明访问它.

通过类型引用使用重写方法Parent永远不会违反"它可能抛出IOException" 的合同- 没有异常不会违反合同.反过来(如果父级没有声明异常,但重写方法确实如此)违反合同.