我该如何重写抽象内部类的方法?

4
我的代码如下:
核心/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在同一个包中,编译就会成功。我不知道为什么。


@override注释缺失...虽然我也是Java新手,但我可能是错的。 - worked
@Override注解并不能解决这个问题。你可以尝试一下。 - user1086901
1个回答

5
有一些关于包私有成员的非直观规则。基本上,如果覆盖类与原类在同一个包中,你可以重写包私有方法。如果不在同一个包中,则无法访问AbstractInner类中run()的声明,因此无法覆盖它。相反,你正在声明具有相同签名的新方法。
如果在AbstractInner中(以及Inner中)将run()设置为protected(或public),而不是使用默认可见性,它将按预期工作。
请记住,只有在接口中声明的方法隐式地为public。在抽象类中,它们隐式地为包私有。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接