Может ли анонимный класс реализовать неабстрактный метод абстрактного класса?

абстрактный класс абстрактный метод не может быть переопределен с помощью анонимного класса?. Инструмент FindBugs выдает проблему "Uncallable method of anonymous class". Пожалуйста, проверьте ниже для получения дополнительной информации

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 ответов


Да, это возможно. Вы можете переопределить любой не окончательный, не статический метод


Да, это возможно!

причина?

анонимный класс позволяет одновременно объявлять и создавать экземпляр класса, и в вашем примере кода это строка: (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      
                }
            };