2011-01-03 1 views
61

Est-il possible de créer une instance d'une interface en Java?Pouvons-nous créer une instance d'une interface en Java?

Quelque part, je l'ai lu en utilisant la classe anonyme interne nous pouvons le faire comme indiqué ci-dessous:

interface Test 
{ 
    public void wish(); 
} 
class Main 
{ 
    public static void main(String[] args) 
    { 
     Test t=new Test() 
     { 
      public void wish() 
      { 
       System.out.println("output: hello how r u"); 
      } 
     }; 
    t.wish(); 
    } 
}  

cmd> javac Main.java 
cmd> java Main 
output: hello how r u 

Est-il exact ici?

+0

Pourquoi auriez-vous besoin de cela? Le but des interfaces est d'avoir des méthodes vides à étendre avec vos propres fonctionnalités. – Ahmed

+6

@Ahmed: afin de prototyper rapidement une implémentation d'interface? Ou peut-être implémenter un gestionnaire d'événement, sans avoir à créer une classe nommée juste pour le faire? Et ainsi de suite ... – rsenna

+6

Cela a déjà été demandé ici: http://stackoverflow.com/questions/4000062/can-we-create-an-object-of-an-interface – jjnguy

Répondre

37

Oui, votre exemple est correct. Les classes anonymes peuvent implémenter des interfaces, et c'est la seule fois où je peux penser que vous verrez une classe implémentant une interface sans le mot clé "implements". Découvrez un autre exemple de code ici:

interface ProgrammerInterview { 
    public void read(); 
} 

class Website { 
    ProgrammerInterview p = new ProgrammerInterview() { 
     public void read() { 
      System.out.println("interface ProgrammerInterview class implementer"); 
     } 
    }; 
} 

Cela fonctionne très bien. A été tirée de cette page.

http://www.programmerinterview.com/index.php/java-questions/anonymous-class-interface/

+0

est cette compilation sans erreurs, Selon mes connaissances interfaces ne peuvent pas être instanciées, mais dans votre réponse, il est fait par la ligne 'ProgrammerInterview p = new ProgrammerInterview() {' –

+1

dans l'exemple ci-dessus, nous n'avons pas instancié un objet de ProgrammerInterview ce que nous avons fait est que nous avons utilisé ProgrammerInterview pour créer une référence, puis créé un objet de classe anonyme. Cette classe anonyme a implémenté ProgrammerInterview et créé l'objet de la classe anonyme en une seule fois. –

+1

Mais n'appelez-vous pas 'new ProgrammerInterview() {...'? Donc, techniquement, vous faites une instance de l'interface. Je suis encore un peu confus sur ce qui se passe ici. – CapturedTree

4

Réponse courte ... oui. Vous pouvez utiliser une classe anonyme lorsque vous initialisez une variable. Jetez un oeil à this

+0

Je dirais non ... Parce que anonyme implémente l'interface ... Mais vous n'avez pas implémente mot-clé –

80

Vous ne pouvez jamais instancier une interface dans Java. Vous pouvez cependant faire référence à un objet qui implémente une interface par le type de l'interface. Par exemple,

public interface A 
{ 
} 
public class B implements A 
{ 
} 

public static void main(String[] args) 
{ 
    A test = new B(); 
    //A test = new A(); // wont compile 
} 

Vous avez créé ci-dessus une classe anonyme qui implémente l'interface. Vous créez un objet anonyme, pas un objet de type interface Test.

+8

Les classes anonymes n'ont pas de noms .... anonyme – jjnguy

+1

Il est demandé si son exemple était correct, et il est. Pas sûr si vous avez reconnu que ... – rsenna

+4

L'exemple fonctionne ... mais pas comme il le pense. Il est important de comprendre ce que le code fait vraiment. Je ne l'appellerais pas "correct" si le code est quelque chose de différent alors il le pense. –

0

Oui, c'est correct. vous pouvez le faire avec une classe interne.

+0

Cela semble la plus correcte des réponses, même s'il n'y a pas d'explication. Pour vous les programmeurs Android, Google fournit un exemple de classe ** instanciant ** une interface interne [ici] (https://developer.android.com/guide/topics/ui/dialogs.html#PassingEvents). –

4

Normalement, vous pouvez créer une référence pour une interface. Mais vous ne pouvez pas créer une instance pour l'interface.

0

Oui nous pouvons, « classes anonymes vous permettra de rendre votre code plus concis Ils vous permettent de déclarer et instancier une classe en même temps, ils sont comme les classes locales. sauf qu'ils n'ont pas de nom "- >>Java Doc

3

Non à mon avis, vous pouvez créer une variable de référence d'une interface mais vous ne pouvez pas créer une instance d'une interface comme une classe abstraite.

Questions connexes