10
votes

Ceci semble créer un objet à partir d'une interface; Comment ça marche?

interface Int {
    public void show();
}

public class Test {     
    public static void main(String[] args) {
        Int t1 = new Int() {
            public void show() {
                System.out.println("message");
            }
        };

        t1.show();
    }
}

0 commentaires

4 Réponses :


18
votes

Vous définissez une classe anonyme qui implémente l'interface int et crée immédiatement un objet de type goanonymousclassyoujustMade . .


2 commentaires

Ceci est vraiment utile pour les gestionnaires d'événements (tels que ceux qui utilisent l'interface ActionListener).


Je ne suis pas tout à fait sûr, ce qui est bien sûr un péché à punir. Pour moi, c'est plus une question de perspective. Du point de vue de l'auteur du code, il déclare un champ, et ce champ a un type, donné avant son nom. C'est une explication propre imho. Il est plus vivant lorsque DE DECLARE Méthode par défaut dans l'interface faisant effectivement SMTH et que nous laissons le corps de la classe anonyme complètement vide, la seule fonctionnalité d'un nouvel objet provient de la méthode d'interface par défaut. Je sais que dans la réalité, la classe anonyme est créée, mais je me demandais simplement si une approche donnée ci-dessus ne peut pas être au moins concistée



4
votes

Qu'est-ce que cette syntaxe spéciale pour les classes intérieures anonymes sous la hotte est créée une classe appelée test 1 $ . Vous pouvez trouver ce fichier de classe dans votre dossier de classe en regard de la classe de test, et si vous imprimez t1.getclass (). GetName () Vous pouvez également voir cela.


0 commentaires

8
votes

Cette notation est sténographique pour

Int t1 = new MyIntClass();

// Plus this class declaration added to class Test
private static class MyIntClass implements Int
    public void show() {
        System.out.println("message");
    }
}


0 commentaires

0
votes

Je pense que votre objet n'a rien à voir avec l'interface. Si vous commencez toute l'interface, vous obtiendrez toujours la même sortie. Sa classe juste anonyme créée. Je pense que si vous n'utilisez pas les "outils" de la classe, vous ne pouvez pas implémenter l'interface. Mais je ne sais pas comment la collision de nommage n'arrive pas dans votre cas.


1 commentaires

La classe anonyme implémente définitivement l'interface et instance de t1 int sera vraie.