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继承该方法。请确保:这不是当前考试,是吗?是的,它来自当前考试