如何覆盖抽象内部类的方法?

时间:2011-12-08 03:17:33

标签: java override abstract-class javac inner-classes

我的代码是:

芯/ Base.java

package core;
public class Base {
    public abstract class AbstractInner {
        abstract void run();
    }
}

Test.java

class Test extends core.Base {
    class Inner extends AbstractInner {
        void run() {}
    }
}

javac抱怨如下;

shell> javac -cp . Test.java 
Test.java:2: Test.Inner is not abstract and does not override abstract method run() in core.Base.AbstractInner
    class Inner extends AbstractInner {
    ^

我的错误是什么?

如果Base与Test位于同一个包中,则编译成功。我不知道为什么。

1 个答案:

答案 0 :(得分:5)

有一些非直观的规则管理包私有成员的可覆盖性。实际上,如果重写类位于同一个包中,则可以覆盖package-private方法。如果不是,则无法看到查看 AbstractInner的{​​{1}}声明,因此无法覆盖它。相反,您要声明具有相同签名的新方法。

如果您在run()(以及run()中)AbstractInner受保护(或公开),而不是使用默认的可见性,它将按预期工作。

回想一下,只在接口中隐式声明了方法Inner。在抽象类中,它们是隐式的包私有。