6

..如果是这样,行为是什么?我在最近查看的一些代码中遇到了这个问题,这让我很困惑。我没有java编译器,所以我自己不能轻易回答这个问题。这是我正在谈论的粗略示例。我希望这会导致编译错误,但据我所知,它来自工作代码库。

abstract class Base {
    ...
    abstract boolean foo(String arg);

}

class Sub extends Base {
    ...
    boolean foo(String arg) {
        if(condition) 
            return true;
        else 
            return super.foo(arg); //<-- <boggle/>
    }
}
4

5 回答 5

18

不,如果它在超类中是抽象的,你就不能调用它。尝试编译您的代码(已修复其他代码)会出现此错误:

Test.java:13: abstract method foo(String) in Base cannot be accessed directly
            return super.foo(arg); //<-- <boggle/>
                        ^
于 2011-02-15T18:09:44.160 回答
6

当您输入“超级”时。在方法名称之前,你对编译器说:'嘿,伙计!调用完全在基类中实现的方法'。它实际上并不存在,因此无法调用它并且编译器会抱怨。只需删除“超级”。并离开 'foo(arg);' 只要。这将告诉编译器在某个子类中寻找实现。

顺便说一句,如果你的例子中的条件总是假的,它会因为内存不足而进入不定式循环并崩溃:)

干杯,~r

于 2014-01-23T12:51:29.463 回答
3

那不会编译。您不能调用抽象方法。

于 2011-02-15T18:11:03.813 回答
2

将您的示例扔到 Eclipse 中并对其进行编辑,以便它实际编译到那么远会产生此错误:

“不能直接调用 Base 类型的抽象方法 foo(String)”

您确定这来自“工作代码库”吗?

于 2011-02-15T18:12:19.710 回答
2

抽象方法不能被调用,因为它只是一个声明类型,没有定义就没有调用它的意义。因此会发生编译时异常

于 2014-01-23T12:58:06.343 回答