web-dev-qa-db-fra.com

Création de l'instance de classe abstraite ou de classe anonyme

Dans ce code, crée-t-il l’objet de la classe abstraite ou de la classe anonyme? Dites-le moi. Je suis un peu confus ici.

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());
    }

}
11
DroidNinja

Vous créez une classe anonyme qui étend votre classe abstraite.

Dans la section ci-dessous, vous étendez AbstractDemo et fournissez des implémentations pour ses méthodes abstraites.

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

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

Voici ce qui s'est passé dans ce morceau de code court et innocent:

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. La nouvelle classe a été définie (sans nom, dite classe anonyme)
  2. Cette nouvelle classe étend la classe AbstractDemo
  3. Les méthodes abstraites de AbstractDemo ont été remplacées dans cette nouvelle classe
  4. Une nouvelle instance de cette nouvelle classe a été créée et affectée à la variable ad

En savoir plus sur anonymous classes en Java ici .

5
Piotr Sobczyk

Vous ne pouvez pas créer une instance d'une classe abstraite.
Vous pouvez créer une instance d'une classe qui étend votre classe abstraite.

L'intérêt d'une classe abstraite est qu'il est abstrait - vous avez défini une interface mais pas une implémentation . Sans implémentation, l'instanciation de la classe ne produirait pas de résultat significatif ou utile. S'il est logique d'instancier des objets de cette classe, vous ne voulez tout simplement pas utiliser une classe abstraite en premier lieu.

Vous pouvez utiliser le concept de classe anonyme pour une instance comme celle ci-dessous:

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
Shreyos Adikari
@Override // Here
void showMessage() {
    // TODO Auto-generated method stub
}

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

tout d'abord, vous devez savoir que vous ne pouvez pas créer une instance pour abstract class. Ici, vous créez simplement un anonymous class qui agit comme un inner class qui étend le abstract class de sorte qu'il appartient à votre anonymous class.

1
praveen Babu

Vous êtes redéfinissant abstract methods dans anonymous class .. c'est pourquoi vous pouvez créer l'objet. voir ci-dessous.

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

        }

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

Un implementation of Abstract Class peut être instancié comme vous le faites.

0
amicngh

L'objet d'une classe abstraite autonome ne peut pas être créé, mais un objet de classe abstraite anonyme peut être créé car il fournit une implémentation sur-le-champ.

La raison pour laquelle Java n'autorise pas d'objet de classe abstraite est, parce qu'il n'a aucune implémentation pour aucune méthode ou pour certaines des méthodes, alors comment pourriez-vous avoir un objet de classe incomplète. Mais de manière anonyme ici, vous lui donnez l’implémentation pour vous permettre d’avoir un objet.

Même cas avec interface

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

Ici, la classe AbstractDemo est abstraite, mais sa classe d'implémentation peut avoir l'objet, donc ici, un code de classe anonyme implémente le code, ce qui permet parfaitement d'avoir un objet.

Pour en savoir plus, voir le code ci-dessous, MyAbstractClass est une classe abstraite, maintenant, si vous commentez 

abstract void play();

alors cela fonctionne très bien, Java permet de rendre objet de cette classe abstraite, mais lorsque vous supprimez la mise en commentaire de ce type, il refuse, car il n’a aucune implémentation concernant cette méthode, refuse donc de créer objet.

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());
    }

}

vérifiez attentivement que {} après l'appel du constructeur, cela signifie qu'aucune autre implémentation n'est requise, ou vous pouvez remplacer sa méthode ou plus.

0
anshulkatta

Nous fournissons ici l'implémentation de la classe abstraite.Par le temps que nous fabriquons objet, nous fournissons son implémentation et redéfinissons toutes les méthodes abstraites. Dans le cas d'une classe abstraite n'ayant qu'une méthode concrète.

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());
    }
}

Ici, nous créons juste un objet en utilisant un constructeur invoquant comme {}.

  1. nous prouvons l'implémentation en utilisant une classe anonyme.

2. Ce qui n'est rien d'autre qu'une classe sans nom que nous devons faire lorsque nous faisons un objet.

  1. Oui, nous faisons un objet de classe abstraite en prouvant l'implémentation au moment de l'exécution.

4.Il ouvre la réponse du type Pourquoi la classe abstraite autorise-t-elle le constructeur? mais nous ne pouvons pas en créer un objet.

5.Une autre question liée à la classe abstraite est que nous ne pouvons avoir qu'un bloc statique dans une classe abstraite. Quel est ce sens?

6.Un bloc statique uniquement parce que nous voulons charger une seule fois sans étendre ni en créer un objet.

7.Une fois le code compilé, nous utilisons pour obtenir .class de chaque classe concrète, classe abstraite ou interface.

8.La question suivante se pose ici. Pourquoi les gens de Java n'autorisent-ils pas les blocs statiques dans l'interface? 

0
Gaurav Tiwari

AbstractDemo n'est plus abstrait après la mise en œuvre de ses méthodes abstraites dans la classe anonyme. C'est comme si on disait:

Class AbstractDemoImpl extends AbstractDemo {

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