当前位置: 首页 > 面试题库 >

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

潘皓
2023-03-14
问题内容

我的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

public class Child1 extends Parent{
     public int getX(){
        return x+10;
   }
}

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

new Parent().getX() ;

不会try-catch如预期那样将其封闭在一个块中而无法编译。

new Child().getX() ;

编译而不将它封闭在一个try-catch块中。

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

Parent p = new Child();
p.getX();

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


问题答案:

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

通过类型引用使用重写方法Parent永远不会违反“可能抛出IOException” 的约定-缺少异常不会违反约定。反之(如果父母 没有
声明例外,但重写方法确实声明了例外) 违反合同。



 类似资料:
  • 我正在编写一个带有对象的游戏,我想根据它的类使用不同的命令。我有一个超级类“项目”,一个子类“工具扩展项目”和“锤子扩展工具”。在项目超类(抽象)中,我有一个抽象方法“doCommand”,我在工具中覆盖了它。这很好用,我现在在工具中有一个有效的“doCommand”。但是当我想在 Hammer 中覆盖这个“doCommand”时,它只是使用工具的“doCommand”。 这来自调用方法的类的一部

  • 问题内容: 我有两个课,和。它们看起来像这样: 此错误指向Field的: 我希望首先调用Background init ()。要将“ a,b”传递给Fields的 init (),Field会分配a和b,然后将其中包含三个0的列表分配给field。然后让Background的 init ()继续,然后调用它自己的buildField()并用包含c的列表覆盖self.field。 似乎我还没有完全理

  • 我创建了一个(个人、学生、员工、教职员工)类。Person必须将Student和Employee分为子类。Employee有两个子类:教员和职员。我已经完成了所有的编码,他们工作得很好,除了我的驱动程序类TestPerson程序给出了编译错误 注:一个测试程序,创建一个人、学生、员工、教职员工,并调用他们的toString方法。 驱动程序类TestPerson的错误。以下是java:- **我只是

  • 如何/可以重写来自非继承类的方法?其次,有没有比“非继承类”更好的术语? 我有一个“扩展”JFrame的类,需要从JPanel重写paintComponent。怎么做?或者它可以扩展JPanel,并需要访问方法,如setTitle()、setResizable()和setDefaultCloseOperation();

  • 问题内容: 我有一个关于Java中用于继承的方法的快速问题-在哪里我从按钮一直到父类中调用该方法。 该方法应该返回该对象的副本,但是如果我在继承继承中有三个类并调用三次,为什么继承继承中的最高类(仅在Object类下)获取该类的副本回来? 假设我们有三个类:A,B和C,其中A-> B-> C(继承=->) 然后,在类C中进行调用,在B中进行调用,在B中进行调用,在A中进行调用,这将调用“这次Obj

  • 我偶然发现了这段代码。 在实际运行它之前,我试图猜测运行它的结果是什么。当我看到它们时,我真的很困惑&需要一些解释。 这是代码: 为什么会这样? ? 为什么还要出现?我根本没有实例化。 并且如果出现,为什么会出现在之后?