Java 匿名类能否实现抽象类的非抽象方法?
抽象类非抽象方法是否可以使用匿名类重写?。FindBugs工具正在发布“匿名类的不可调用方法”问题。有关更多信息,请查看下面的示例Java 匿名类能否实现抽象类的非抽象方法?,java,findbugs,Java,Findbugs,抽象类非抽象方法是否可以使用匿名类重写?。FindBugs工具正在发布“匿名类的不可调用方法”问题。有关更多信息,请查看下面的示例 public class BaseClass { // This class is a Library Class. } public abstract class AbstractBaseClass extends BaseClass { public abstract void abstractMethod(); public void
public class BaseClass {
// This class is a Library Class.
}
public abstract class AbstractBaseClass extends BaseClass {
public abstract void abstractMethod();
public void nonAbstractMethod() {}
}
public abstract class DerivedAbstractClass extends AbstractBaseClass {
// Here Some more additional methods has been added
}
public class DemoAbstract {
public static void main(String[] args) {
init();
}
private static void init() {
DerivedAbstractClass derivedAbstractClass = new DerivedAbstractClass() {
@Override
public void abstractMethod() {
}
@Override
public void nonAbstractMethod() {
// Is it possible to override like this?
}
};
}
}
是的,这是可能的。
您可以覆盖任何非最终、非静态方法是的,这是可能的
原因
匿名类使您能够同时声明和实例化一个类,在示例代码中这是一行:(DerivedAbstractClass DerivedAbstractClass=new-DerivedAbstractClass()
)
匿名类与本地类类似,只是它们没有名称
在下面的截图中,您正在扩展DerivedAbstractClass,可以为其抽象方法提供实现,如果需要,还可以重写非抽象方法
但是您可能需要调用super.nonAbstractMethod()如果需要,代码>在覆盖之前,如下所示:
DerivedAbstractClass derivedAbstractClass = new DerivedAbstractClass() {
@Override
public void abstractMethod() {
//anonymous clas providing implemntation
}
@Override
public void nonAbstractMethod() {
super.nonAbstractMethod();
//anonymous clas overriding
}
};
是的,这是可能的。正是这个示例(复制并粘贴,没有任何更改)生成了警告吗?当然,您可以覆盖它,但即使不覆盖,匿名类仍然提供了一个实现,因此更好的问题是:匿名类是否可以不实现此方法?您好,immibis,我已经编辑了我的示例。请检查我下面的确切示例。我看不出问题。抱歉,这在定义侦听器时使用了很多(例如在Android的View.OnClickListener中)。我不能在JAVA中重写main()
?它是静态的,但我可以!!但是,对于上面的代码,FindBugs报告了一个bug:这个匿名类定义了一个不直接调用的方法,并且不重写超类中的方法@朱奈德:不,你不能。@SarathUpadrista:我认为提供的代码没有任何问题。你能发布DerivedAbstractClass
的内容吗?我想知道“FindBugs”报告的“匿名类的不可调用方法”的确切含义。被重写的方法如何是不可调用的?