Java抽象类声明throwable - 实现不强制执行它?

问题描述:

我想知道如何使用抽象类和接口的区别,这困扰了我一下:Java抽象类声明throwable - 实现不强制执行它?

假设你有一个抽象类

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()的实现,我们还提到我们希望它引发异常 - 但是在上面的代码段中已经省略了。

我是否认为在接口和'实现'声明中这样做是不允许的?

我想,因为您使用@override注释了方法,编译器根本不在乎您做什么,只要您有一个方法具有您在ADT中强制实施的名称?它会检查返回类型,为什么它不执行异常?

我们不希望该方法总是抛出一个异常(否则我们永远不会得到一个有意义的结果),我们说“这个方法可能会抛出这个异常”。如果没有意义,让子类不抛出异常是完全正确的。

如果您的客户端代码知道它正在处理子类,那么它将不必处理异常,作为额外的奖励。

在你的实现中没有声明一个throw子句来实现一个声明一个throw子句的接口方法也是完全不错的。

+0

在声明抽象方法可能抛出异常时有任何用处吗?似乎多余,如果它可以被忽略或特定于实现。虽然如果抽象方法的契约清楚地表明有一个先决条件,可能会很高兴提到实现应该引发异常 – Runecreed