Java 如何重写抽象内部类的方法?
我的代码是: core/Base.javaJava 如何重写抽象内部类的方法?,java,overriding,abstract-class,javac,inner-classes,Java,Overriding,Abstract Class,Javac,Inner Classes,我的代码是: core/Base.java package core; public class Base { public abstract class AbstractInner { abstract void run(); } } class Test extends core.Base { class Inner extends AbstractInner { void run() {} } } Test.java pa
package core;
public class Base {
public abstract class AbstractInner {
abstract void run();
}
}
class Test extends core.Base {
class Inner extends AbstractInner {
void run() {}
}
}
Test.java
package core;
public class Base {
public abstract class AbstractInner {
abstract void run();
}
}
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位于同一个包中,则编译成功。我不知道为什么。有一些非直观的规则控制包私有成员的覆盖性。本质上,如果重写类位于同一个包中,则可以重写包私有方法。如果不是,它就无法看到
AbstractInner
的run()
声明,因此无法覆盖它。相反,您正在声明一个具有相同签名的新方法
如果在AbstractInner
中(因此也在Inner
中)使run()
受保护(或公开),而不是使用默认可见性,它将按预期工作
回想一下,只有在接口中才隐式地声明了方法
public
。在抽象类中,它们是隐式包私有的。@缺少覆盖注释。。。我可能是错的,虽然我也是java新手。@重写注释不能解决这个问题。你可以试试。