2015-12-17 1 views
7

Je traversais tutoriel de classe anonyme de documentation Oracle (https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html)Les déclarations contenues dans la déclaration de classe anonyme

J'ai copié le code utilisé dans le tutoriel (Commentaires Statement1 et Statement2 sont joints en annexe par moi):.

public class HelloWorldAnonymousClasses { 

    interface HelloWorld { 
     public void greet(); 
     public void greetSomeone(String someone); 
    } 

    public void sayHello() { 

     class EnglishGreeting implements HelloWorld { 
      String name = "world"; 
      public void greet() { 
       greetSomeone("world"); 
      } 
      public void greetSomeone(String someone) { 
       name = someone; 
       System.out.println("Hello " + name); 
      } 
     } 

     HelloWorld englishGreeting = new EnglishGreeting(); 

     HelloWorld frenchGreeting = new HelloWorld() { 
      String name = "tout le monde"; //Statement1 
      public void greet() { 
       greetSomeone("tout le monde"); 
      } 
      public void greetSomeone(String someone) { 
       name = someone; 
       System.out.println("Salut " + name); 
      } 
     }; 

     HelloWorld spanishGreeting = new HelloWorld() { 
      String name = "mundo"; //Statement2 
      public void greet() { 
       greetSomeone("mundo"); 
      } 
      public void greetSomeone(String someone) { 
       name = someone; 
       System.out.println("Hola, " + name); 
      } 
     }; 
     englishGreeting.greet(); 
     frenchGreeting.greetSomeone("Fred"); 
     spanishGreeting.greet(); 
    } 

    public static void main(String[] args) { 
     HelloWorldAnonymousClasses myApp = 
      new HelloWorldAnonymousClasses(); 
     myApp.sayHello(); 
    }    
} 

le tutoriel explique ensuite: l'expression de classe anonyme se compose des éléments suivants:

  1. Nouvel opérateur

  2. Nom d'une interface à implémenter ou d'une classe à étendre. Dans cet exemple, la classe anonyme met en œuvre l'interface HelloWorld.

  3. Parenthèses contenant les arguments d'un constructeur, tout comme une expression de création d'instance de classe normale. Remarque: Lorsque vous implémentez une interface, il n'y a pas de constructeur, vous utilisez donc une paire de parenthèses vide, comme dans cet exemple.

  4. Un corps, qui est un corps de déclaration de classe. Plus spécifiquement, dans le corps, les déclarations de méthode sont autorisées mais pas les déclarations.

Je suis confus par le point no. 4 ci-dessus. Il dit que les déclarations ne sont pas autorisées dans le corps de la déclaration de classe anonyme, mais je peux voir les déclarations utilisées à l'intérieur. (J'ai mis les commentaires Statement1 et Statement2 pour les mettre en évidence).

Pourriez-vous expliquer ce que le didacticiel veut transmettre à partir du point no. 4?

Merci d'avance.

+3

ce n'est pas une instruction mais une définition de variable d'instance et une initialisation – sidgate

+1

Ce sont des déclarations de champs et devraient aussi être 'private', ce qui aurait permis d'éliminer votre confusion. – Andreas

Répondre

5

Statements ne sont pas autorisés signifie que les éléments suivants ne sont pas autorisés.

  • expressions d'affectation (aValue = 8933.234;)
  • Toute utilisation de ++ ou - (aValue++;)
  • invocations de méthode (System.out.println("Hello World!");)
  • expressions de création d'objets (Bicycle myBike = new Bicycle();)

Mais this documentation dit aussi que,

Notez que vous pouvez déclarer ce qui suit dans les classes anonymes:

  • Les champs
  • méthodes supplémentaires (même si elles ne mettent pas en œuvre des méthodes de supertype)
  • Instance initializers
  • classes locales
HelloWorld spanishGreeting = new HelloWorld() { 

     String name = "mundo"; //Statement2 

     double aValue = 0.0; 

     String s = "Hi"; //instance variable initializers are allowed 

     // assignment statement 
     aValue = 8933.234; // not allowed 

     // increment statement 
     aValue++; // not allowed 

     // method invocation statement 
     System.out.println("Hello World!"); // not allowed 

     // object creation statement 
     Bicycle myBike = new Bicycle(); //instance variable initializers are allowed 

     public void greet() { 
      greetSomeone("mundo"); 
     } 
     public void greetSomeone(String someone) { 
      name = someone; 
      System.out.println("Hola, " + name); 
     } 
    }; 

Espérons que cela aide.

+0

pas autorisé: Les expressions de création d'objet (Bicycle myBike = new Bicycle ();) mais vous avez créé un objet String avec // commentaire autorisé. Ceci est déroutant. – miraclefoxx

+0

@miraclefoxx: Je mettais à jour la réponse. Désolé pour le retard. –

+0

cela ressemble encore à une contradiction pour moi. Apprécierait une courte explication – miraclefoxx

3

Vous avez confondu entre statement et field declaration. Comme mentionné dans le commentaire par @sidgate, ce n'est pas une déclaration mais la définition d'instance et l'initialisation.

Pour comprendre plus clairement essayer de mettre des déclarations comme

HelloWorld frenchGreeting = new HelloWorld() { 
      String name = "tout le monde"; //Statement1 
      System.out.print("this is a statement");// it wont compile 
      public void greet() { 
       greetSomeone("tout le monde"); 
      } 
      public void greetSomeone(String someone) { 
       name = someone; 
       System.out.println("Salut " + name); 
      } 
     }; 
+1

Donc, cette "déclaration dans l'interdiction du corps de la classe anonyme" signifie-t-elle simplement que vous ne pouvez pas mettre des instructions en dehors d'une méthode ou d'un bloc d'initialisation? Ceci est appliqué à n'importe quelle classe Java, alors pourquoi mentionner explicitement pour les classes anonymes? – miraclefoxx

+1

@miraclefoxx Vous avez raison, cela s'applique à n'importe quelle classe et c'est un peu déroutant de les mettre en évidence uniquement pour les cours anonymes. Je suppose * qu'ils le font parce qu'une classe anonyme peut ressembler un peu à un bloc de code, et donc vous pouvez vous attendre à pouvoir mettre une déclaration dedans. –

0

Son comme 3 ans de retard, mais juste pour le mettre d'une manière différente de comprendre. Le corps de la classe anonyme est comme n'importe quel autre corps de classe supérieur.

Nous ne pouvons avoir que des membres dans la classe, c'est-à-dire des variables (avec ou sans initialisation) et des méthodes et des blocs d'initialisation.

Les instructions ne peuvent apparaître que dans une méthode ou dans des blocs d'initialisation, mais pas par elle-même.