我的代码是:
芯/ 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位于同一个包中,则编译成功。我不知道为什么。
答案 0 :(得分:5)
有一些非直观的规则管理包私有成员的可覆盖性。实际上,如果重写类位于同一个包中,则可以覆盖package-private方法。如果不是,则无法看到查看 AbstractInner
的{{1}}声明,因此无法覆盖它。相反,您要声明具有相同签名的新方法。
如果您在run()
(以及run()
中)AbstractInner
受保护(或公开),而不是使用默认的可见性,它将按预期工作。
回想一下,只在接口中隐式声明了方法Inner
。在抽象类中,它们是隐式的包私有。