我想知道使用抽象类和接口之间的区别,这让我感到困惑:
假设您有一个抽象类
public abstract class Animal {
//return the tail lenght of the animal
public abstract int getTailLength() throws IllegalStateException;
}
承诺抽象类的实现有一个名为getTailLength()的方法[编译器强制扩展类为@override抽象类并实现它们],如下所示:
public Snake extends Animal(){
@override
public int getTailLength(){
return 10;
}
}
当我们声明想要getTailLenght()的实现时,编译器在抽象类中很好,我们还提到我们希望它抛出一个异常 - 但是在上面的代码片段中已被省略。
我是否认为在使用Interface和'implements'声明做同样的事情时这是不允许的?
我想因为你用@override注释方法,只要你有一个在ADT中强制执行的名称的方法,编译器就不关心你做什么了?它会检查返回类型,为什么不强制执行异常?
答案 0 :(得分:0)
我们不希望该方法一直抛出异常(否则我们永远不会得到有意义的结果),我们说"此方法可能会抛出此异常&#34 34 ;.如果没有意义,让子类不抛出异常就完全没问题了。
如果您的客户端代码知道它正在处理子类,那么它不必处理异常,作为额外的奖励。
在实现中不声明throw子句以实现声明throw子句的接口方法也是完全没错。