为什么这会编译? (在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 ,它们就可以编译。由于抽象方法旨在由实现者实现,因此这没有意义。进一步玩这个,当一大块代码试图调用未实现的方法时,我只收到编译错误。
所以再一次,我的问题是,有没有人知道为什么编译器允许这个(或者为什么我们希望它这样做)?
补充评论:
答案 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)
这可能不是故意的。静态抱怨抽象类的代码可以在编译方法调用时运行,而不是在声明类时运行(因为调用方法是潜在的坏部分,而不是声明它)。这绝对是他们可以添加的东西,但它不会有任何有用的东西,所以他们可能认为它不值得。