我想知道使用抽象类和接口(interface)之间的区别,这让我有点困惑:
假设你有一个抽象类
public abstract class Animal {
//return the tail lenght of the animal
public abstract int getTailLength() throws IllegalStateException;
}
promise 抽象类的实现有一个名为 getTailLength() 的方法[编译器强制扩展类 @override 抽象类并实现它们],如下所示:
public Snake extends Animal(){
@override
public int getTailLength(){
return 10;
}
}
编译器对此没有问题,但在抽象类中,当我们声明想要实现 getTailLenght() 时,我们还提到我们希望它抛出异常 - 但在上面的代码片段中已被省略。
我是否正确地认为,在对接口(interface)和“实现”声明执行相同操作时这是不允许的?
我想,因为您使用 @override 注释该方法,所以只要您有一个具有您在 ADT 中强制执行的名称的方法,编译器就不会关心您做什么?它确实检查返回类型,为什么它不强制执行异常?
最佳答案
我们不希望该方法一直抛出异常(否则我们永远不会得到有意义的结果),我们说“这个方法可能会抛出这个异常”。如果没有意义,让子类不抛出异常是完全可以的。
如果您的客户端代码知道它正在处理子类,那么它就不必处理异常,这是一个额外的好处。
在实现中不声明 throw 子句来实现声明 throw 子句的接口(interface)方法也是完全可以的。
关于Java 抽象类声明 throwable - 实现不强制执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35634702/