Создание экземпляра абстрактного класса или анонимного класса

В этом коде здесь создается объект абстрактного класса или анонимного класса? Пожалуйста, скажите мне. Я немного смущен здесь.

public abstract class AbstractDemo {

    abstract void showMessage();
    abstract int add(int x,int y);

    public int mul(int x,int y){
        return x+y;
    }


    public static void main(String[] args) {
        AbstractDemo ad = new AbstractDemo() {

            @Override
            void showMessage() {
                // TODO Auto-generated method stub

            }

            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        };

        System.out.println(ad.mul(10, 12));
        System.out.println(ad.getClass());
    }

}

Ответ 1

Вы создаете анонимный класс, который расширяет ваш абстрактный класс.

В приведенном ниже фрагменте вы расширяете AbstractDemo и предоставляете реализации для своих абстрактных методов.

new AbstractDemo() {
    @Override
    void showMessage() {
        // TODO Auto-generated method stub
    }

    @Override
    int add(int x, int y) {
        // TODO Auto-generated method stub
        return 0;
    }
};

Ответ 2

Вот что произошло в этом коротком и невинном фрагменте кода:

AbstractDemo ad = new AbstractDemo() {

            @Override
            void showMessage() {
                // TODO Auto-generated method stub

            }

            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        };
  1. Был определен новый класс (без имени, так называемый анонимный класс)
  2. Этот новый класс расширяет класс AbstractDemo
  3. Абстрактные методы AbstractDemo были переопределены в этом новом классе
  4. Новый экземпляр этого нового класса был создан и назначен переменной ad

Подробнее об anonymous classes в Java читайте здесь.

Ответ 3

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

Вся суть абстрактного класса заключается в том, что он абстрактный - вы определили интерфейс, но не реализацию. Без реализации экземпляр класса не принесет значимого или полезного результата. Если это делает/имеет смысл для создания объектов этого класса, то вы просто не хотите использовать абстрактный класс в первую очередь.

Вы можете использовать концепцию анонимного класса для экземпляра, как показано ниже:

AbstractDemo abstractDemo  = new AbstractDemo() {
            @Override
            void showMessage() {
                // TODO Auto-generated method stub
            }
            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        }; 

Ответ 4

@Override // Here
void showMessage() {
    // TODO Auto-generated method stub
}

@Override // here
int add(int x, int y) {
    // TODO Auto-generated method stub
    return 0;
}

Прежде всего, вам нужно знать, что вы не можете создать instance для abstract class, здесь вы просто создаете anonymous class, который действует как inner class, который расширяет abstract class, поэтому его принадлежит вашему anonymous class.

Ответ 5

Вы переопределяете abstract methods в anonymous class.. то, почему вы можете создать объект. см. ниже.

        @Override // Here
        void showMessage() {
            // TODO Auto-generated method stub

        }

        @Override // here
        int add(int x, int y) {
            // TODO Auto-generated method stub
            return 0;

Реализация Abstract Class может быть создана так, как вы это делаете.

Ответ 6

Автономный абстрактный объект класса не может быть выполнен, но анонимный объект абстрактного класса может быть создан, поскольку он обеспечивает реализацию тогда и там.

Причина, по которой Java не разрешает объект абстрактного класса, заключается в том, что у него нет какой-либо реализации для какого-либо метода или для некоторых методов, так как у вас может быть объект неполного класса. Но анонимным способом здесь вы даете ему реализацию, чтобы он мог иметь объект.

Тот же корпус с интерфейсом

 AbstractDemo ad = new AbstractDemo() {

            @Override
            void showMessage() {
                // TODO Auto-generated method stub

            }

            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        };

Здесь класс AbstractDemo является абстрактным, но его класс реализации может иметь объект, поэтому здесь анонимный код класса реализует код, поэтому ему вполне разрешено иметь объект.

Подробнее в этом разделе, см. код ниже, MyAbstractClass - абстрактный класс, теперь, если вы закомментируете

abstract void play();

тогда он отлично работает, Java позволяет создавать объект этого абстрактного класса, но когда вы раскомментируете это, он отрицает, потому что у него нет реализации этого метода, поэтому он отказывается делать объект.

abstract class MyAbstractClass {
    private String name;

    public MyAbstractClass(String name)
    {
        this.name = name;
    }

    public String getName(){
        return this.name;
    }
    abstract void play();



}


public class Test2 {

    public static void main(String [] args)
    {
        MyAbstractClass ABC = new MyAbstractClass("name") {
        };

        System.out.println(ABC.getName());
    }

}

внимательно проверьте {} после вызова конструктора, это означает, что не требуется больше выполнения, или вы можете переопределить его один из методов или более.

Ответ 7

Ваш AbstractDemo не является более абстрактным после того, как его абстрактные методы реализованы в анонимном классе. Его также хорошо говорят:

Class AbstractDemoImpl extends AbstractDemo {

    void showMessage() {
            // TODO Auto-generated method stub
    }
    int add(int x, int y) {
            // TODO Auto-generated method stub
            return 0;
    }
}

Ответ 8

Здесь мы предоставляем реализацию абстрактного класса. Когда мы создаем объект, мы предоставляем его реализацию и переопределяем все абстрактные методы. В случае абстрактного класса, имеющего только конкретный метод. См. Ниже Пример

abstract class MyAbstractClass {
    private String name;

    public MyAbstractClass(String name)
    {
        this.name = name;
    }

    public String getName(){
        return this.name;
    }
}

public class Test {

    public static void main(String [] args)
    {
        MyAbstractClass ABC = new MyAbstractClass("name") {
        };

        System.out.println(ABC.getName());
    }
}

Здесь мы просто делаем объект, используя конструктор вызова, например {}.

  • мы реализуем реализацию с использованием анонимного класса.

2. Это не что иное, как класс без имени, который нам нужно делать, когда мы делаем объект.

  1. Да, мы создаем объект абстрактного класса, доказывая реализацию во время выполнения.

4.Откроем ответ, например, почему абстрактный класс разрешает конструктор? но мы не можем создать его объект.

5. Другой вопрос, связанный с абстрактным классом, состоит в том, что в абстрактном классе может быть только статический блок. Что это значит?

6. Только статический блок, потому что мы хотим загрузить одно время, не расширяя и не создавая его.

7. После компиляции кода мы используем для получения .class каждого конкретного класса, абстрактного класса или интерфейса.

8. Здесь возникает следующий вопрос. Почему java people donot разрешает статический блок в интерфейсе?