Java ExamLab中的异常继承

Java ExamLab中的异常继承,java,Java,此代码来自考试实验室 abstract class AbsA{ public void play()throws InterruptedException{ System.out.print("Playing AbsA"); } } abstract class AbsB extends AbsA{ public abstract void play(); //Line 2 } class NonC extends AbsB{ p

此代码来自考试实验室

  abstract class AbsA{
      public void play()throws InterruptedException{
        System.out.print("Playing AbsA");
      }
    }

abstract class AbsB extends AbsA{
  public abstract void play();  //Line 2
}

class NonC extends AbsB{
  public void play(){
    System.out.print("Playing NonC");
  }
}

class NonD extends NonC{
  public void play(){
    System.out.print("Playing NonD");
  }
}

public class MC{
  public static void main(String args[])throws Exception{
    AbsA d=new NonC();
    d.play();
  }
}
我没有什么疑问 1) 我了解到父类必须抛出比子类更广泛的异常 在类AbsAplay()的情况下,方法抛出选中的异常,当此方法继承到AbsB时,类隐式抛出RuntimeException。 这怎么可能


2) 此外,在第2行,继承的方法带有abstract关键字。有可能吗?

方法必须在
抛出
子句中声明它想要抛出的任何已检查异常。但是,不扔它们是自由的。例如,AbsA的play方法实际上不会抛出任何东西。因此,AbsB也可以扩展play(),完全没有
throws
子句。所以,这没关系:

abstract class AbsB extends AbsA {
    public abstract void play();
}
这也没关系

abstract class AbsB extends AbsA {
    public abstract void play() throws InterruptedException;
}
…因为AbsB的play方法声明抛出与超类中相同的异常

这也没关系

abstract class AbsB extends AbsA {
    public abstract void play() throws NullPointerException;
}
…因为NullPointerException是未经检查的异常(它是RuntimeException的子类)。您始终可以抛出未经检查的异常,无论它们是否声明为抛出。本例中的
throws
子句没有任何作用,因为该方法无论如何都可能抛出NullPointerException,但它可能有助于记录该方法的预期行为:

这将不会编译:

abstract class AbsB extends AbsA {
    public abstract void play() throws IOException;
}
IOException是一个已检查的异常。AbsB无法覆盖AbsA的play方法来抛出新类型的已检查异常,因为如果它覆盖了,AbsB的实例将不是有效的AbsA实例

继承的方法带有abstract关键字。可能吗


对。重写非抽象方法并使其抽象是很少见的,但它是合法的,有时也是有用的。AbsA的游戏方法是“玩AbsA”。AbsB是抽象的,因此永远不需要“播放AbsB”的消息。但是,AbsB将方法抽象化,因此非抽象子对象(如NonC)将被迫重新实现该方法,并且无法从AbsA继承该方法。

请确保:这不是当前考试,是吗?是的,它来自当前考试