2

为什么会这样编译?(在 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,我突然想到另一个类可以扩展该类,因此编译器可能不会抱怨并假设您以后会有其他类道路会照顾它,但是将课程标记为最终课程应该很清楚事实并非如此。
4

2 回答 2

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
于 2012-06-07T17:05:15.870 回答
-1

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

于 2012-06-07T17:00:46.307 回答