匿名类可以实现抽象类的非抽象方法吗?

时间:2015-01-27 08:52:40

标签: java findbugs

使用Anonymous类可以覆盖Abstract类非抽象方法吗? FindBugs工具正在发布"不可赎回的匿名类方法"问题。请查看以下示例以获取更多信息

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?
            }
        };
    }
}

2 个答案:

答案 0 :(得分:2)

是的,这是可能的。 您可以覆盖任何非最终的非静态方法

答案 1 :(得分:1)

是的,有可能!

原因?

使用匿名类可以同时声明和实例化一个类,在示例代码中,这就是行:(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      
                }
            };