(Java)为什么要编译:普通的final类不实现继承的抽象父类的抽象方法

时间:2012-06-07 16:54:10

标签: java compilation

为什么这会编译? (在Oracle java 5& java 6下尝试过(是的,我知道,我很难适应)

public abstract class BaseClass
{
    public abstract void methodA(String abc);

    public abstract String methodB(String abc);
}

public final class ConcreteClass
extends BaseClass
{
}

只需将这两个类弹出到单独的文件中,调用它们上的javac和 poof ,它们就可以编译。由于抽象方法旨在由实现者实现,因此这没有意义。进一步玩这个,当一大块代码试图调用未实现的方法时,我只收到编译错误。

所以再一次,我的问题是,有没有人知道为什么编译器允许这个(或者为什么我们希望它这样做)?

补充评论:

  • 当我进行初步测试时,我最初没有将ConcreteClass标记为final,而且我发现另一个类可以扩展类,因此,编译器可能不会抱怨并假设你会有一些其他课程后来在路上照顾它,但将课程标记为最终应该很清楚,事实并非如此。

2 个答案:

答案 0 :(得分:1)

正如@Jigar在评论中提到的,您必须导入错误版本的BaseClass。当我 试图编译你的代码,我得到以下错误:

/Users/ShirishP/Desktop/ConcreteClass.java:1: ConcreteClass is not abstract and does not override abstract method methodB(java.lang.String) in BaseClass
public final class ConcreteClass extends BaseClass
             ^
1 error

答案 1 :(得分:-1)

这可能不是故意的。静态抱怨抽象类的代码可以在编译方法调用时运行,而不是在声明类时运行(因为调用方法是潜在的坏部分,而不是声明它)。这绝对是他们可以添加的东西,但它不会有任何有用的东西,所以他们可能认为它不值得。