web-dev-qa-db-fra.com

Peut-on créer un objet d'une interface?

interface TestA {
    String toString();
}

public class Test {
    public static void main(String[] args) {
        System.out.println(new TestA() {
            public String toString() {
                return "test";
            }
        });
    }
}

Quel est le résultat?

Un examen
B. nul
C. Une exception est levée lors de l'exécution.
RÉ. La compilation échoue en raison d'une erreur sur la ligne 1.
E. La compilation échoue en raison d'une erreur sur la ligne 4.
F. La compilation échoue en raison d'une erreur sur la ligne 5.

Quelle est la réponse à cette question et pourquoi? J'ai une autre question concernant cette question. Dans la ligne 4, nous créons un objet de A. Est-il possible de créer un objet d'une interface?

31
shirsendu shome

Ce que vous voyez ici est un classe interne anonyme :

Étant donné l'interface suivante:

interface Inter {
    public String getString();
}

Vous pouvez créer quelque chose comme une instance comme ceci:

Inter instance = new Inter() {
    @Override
    public String getString() { 
      return "HI"; 
    } 
  };

Maintenant, vous avez une instance de l'interface que vous avez définie. Mais, vous devez noter que ce que vous avez réellement fait est défini une classe qui implémente l'interface et instancie la classe en même temps.

87
jjnguy

test devrait être la sortie. Ceci est un exemple d'une classe interne anonyme.

Il s'agit d'un modèle très courant utilisé avec l'interface Comparator comme émulation de fermetures.

5
Stefan Kendall

Essayez aussi ... Le nom de la classe anonyme est généré!

Inter instance = new Inter() {
    public String getString(){ return "HI"+this.getClass(); }
};
1
Kshitij

L'astuce ne concerne pas exactement la classe interne anonyme, ce test imprime car il remplace la méthode toString et tandis que System.out.println un objet, il l'appelle implicitement, c'est la méthode toString.

1
Marcos Vasconcelos