3 votes

Cette implémentation serait-elle appelée classe anonyme ?

J'ai vu cela faire plusieurs fois mais je suis un peu confus si oui ou non cela s'appelle une classe anonyme ?

public class Test {
    public static void main(String[] args) {
        new Thread(){
            @Override
            public void run() {
                System.out.println("##");
            }
        }.start();
    }
}

La raison pour laquelle je suis confus est que les classes anonymes n'ont pas de nom, mais il est clair que nous avons déjà une classe "Thread" dans l'API Java, ce qui signifie qu'elle a un nom, et si elle a un nom alors comment peut-elle être une classe anonyme, et si ce n'est pas une classe anonyme alors qu'est-ce qu'elle est.

Je sais que c'est un peu idiot mais je ne suis pas capable de raisonner de manière déterministe car je vois des arguments valables des deux côtés.

De plus, dans la partie ci-dessus, je peux clairement remplacer l'option run méthode de Thread Maintenant, si je crée ma propre classe, disons MyClass et y définir des méthodes, puis essayer de faire la même chose que ci-dessus, alors pourquoi je ne peux pas surcharger les méthodes de l'application MyClass de cette façon, j'ai pu passer outre run méthode de Thread classe.

public class MyClass {
    private void myMethod1() {

    }

    private void myMethod2() {

    }
}

public class Test {
    public static void main(String[] args) {
        new MyClass(){
            // why I cannot override "myMethod1" and "myMethod1" of `MyClass`, they way I was able to override `run` method of `Thread` class
        };
    }
}

5voto

Hovercraft Full Of Eels Points 161146
  1. Oui, votre première classe est anonyme car elle est en ligne et s'étend à partir de Thread. Elle n'est pas la même que votre classe Thread.
  2. Concernant MyClass : Bien sûr, vous ne pouvez pas étendre les méthodes privées. Cela n'a rien à voir avec les classes anonymes et il s'agit des règles d'héritage de base de Java. Rendez-les publiques et vous pourrez les étendre en ligne.

Pour clarifier, si vous avez une classe imbriquée qui a un nom, vous pouvez déclarer une variable de son type :

public class Test {

    private static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("Foo");
        }
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
    }
}

Mais si vous avez une classe anonyme, vous ne pouvez pas le faire :

public static void main(String[] args) {
    new Thread(){
        @Override
        public void run() {
            System.out.println("##");
        }
    }.start();

    // how can you declare a variable of the above type *with* its behavior?
}

Petit détail : vous devriez presque jamais étendre Thread et, à la place, implémenter Runnable, ou mieux encore, utiliser des exécuteurs pour vous aider à réaliser votre threading.


re :

Ok, merci pour votre réponse, corrigez moi si j'ai bien compris - en utilisant une classe anonyme, je peux créer une toute nouvelle classe (essentiellement l'implémentation d'une interface) au moment de l'exécution, je peux aussi étendre une classe existante et elle sera toujours appelée "classe anonyme" ?

Oui, vous faire créer une toute nouvelle classe, mais sans nécessairement implémenter une interface. En fait, votre exemple ci-dessus n'a rien à voir directement avec les interfaces et tout à voir avec l'extension d'une classe concrète existante. Vous êtes sur peut et créent souvent des classes anonymes qui implémentent des interfaces, Runnable étant un exemple courant, mais votre exemple ci-dessus n'est pas "fondamentalement une implémentation d'une interface".

2voto

Yahya Points 2921

Classe publique Thread extends Object implémente Runnable

Donc, vous créez essentiellement une classe anonyme de Classe Thread mais parce que Thread Classe implements Runnable (qui est une interface fonctionnelle qui possède une méthode abstraite) -> il faut alors @override run() qui provient de Runnable Interface

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X