web-dev-qa-db-fra.com

Pourquoi le point-virgule n'est-il pas obligatoire mais autorisé à la fin d'une définition de classe?

J'essaie de passer de C++ à Java.

Ce que je me demande, c'est qu'en C++, après une définition de classe, un point-virgule (;) est requis, mais pas en Java.

C'est-à-dire en C++:

class Person {
    public:
    string name;
    int number;
}; // Note this semicolon

Mais en Java:

class Person {
    public String name;
    public int number;
} // Semicolon is not required

C'est bien, je comprends cela.

Cependant, mon problème est :

Java fonctionne également lorsque j'ajoute un point-virgule à la fin de la définition de classe, comme par exemple:

class Person {
    public String name;
    public int number;
}; // Now this semicolon is confusing me!

J'ai compilé et exécuté les deux extraits de programme présentés pour Java, et ils fonctionnent tous les deux. Quelqu'un peut-il expliquer pourquoi c'est ainsi? Que signifie le point-virgule à la fin d'une définition de classe en Java?

Je suis désolé si cette question est de faible qualité, mais j'ai vraiment besoin d'éclaircissements à ce sujet. J'espère que les experts en Java vont m'aider.

Eh bien, j'ai déjà vu points-virgules dans une définition de classe et d'autres questions connexes.

Merci d'avance.

14
Vedant Terkar

J'ai compilé et exécuté les deux extraits de programme présentés pour Java, et ils fonctionnent tous les deux. Quelqu'un peut-il expliquer pourquoi c'est ainsi?

C'est autorisé parce que la grammaire Java dit que c'est permis; Voir JLS 7.6 .

Que signifie le point-virgule à la fin d'une définition de classe en Java?

Rien. C'est un "bruit syntaxique" optionnel.

Le JLS l'explique comme suit:

Supplémentaire ";" Les jetons apparaissant au niveau des déclarations de type dans une unité de compilation n'ont aucun effet sur la signification de l'unité de compilation. Les points-virgules parasites sont autorisés dans le langage de programmation Java uniquement à titre de concession aux programmeurs C++ habitués à placer ";" après une déclaration de classe. Ils ne doivent pas être utilisés dans le nouveau code Java.


(Notez qu'il ne s'agit PAS d'une "instruction vide". Une instruction vide ( JLS 14.6 ) apparaît dans un contexte syntaxique dans lequel une instruction est autorisée. La présence d'une instruction vide peut modifier le sens de votre code. Exemple: if (a == b) ; c(); par rapport à if (a == b) c();)

20
Stephen C

À l'origine, autoriser cela était l'une des manières dont Java était plus familier pour les programmeurs C/C++. Cette familiarité était importante pour l'adoption de Java.

Voici comment cela fonctionne syntaxiquement.

Après une classe de niveau supérieur, cela fonctionne car une unité de compilation contient cette séquence, conformément à JLS 7.3 :

CompilationUnit:
 PackageDeclaration(opt) ImportDeclarations(opt) TypeDeclarations(opt)

Et une déclaration de type est l’un des suivants, selon JLS 7.6 :

TypeDeclaration:
   ClassDeclaration
   InterfaceDeclaration
   ;

Après une classe membre, imbriqué dans une autre classe, cela fonctionne car un point-virgule peut être une déclaration de membre de classe, selon JLS 8.1.6 :

ClassMemberDeclaration:
    FieldDeclaration
    MethodDeclaration
    ClassDeclaration    
    InterfaceDeclaration
    ;

Après une classe locale, dans une méthode, cela fonctionne car un point-virgule peut être une instruction vide, selon JLS 14.6 :

EmptyStatement:
    ;
9
Andy Thomas

Java a ajouté ceci juste pour les personnes comme vous qui passaient du C++!

En Java, un seul point-virgule est une déclaration qui peut être écrite presque partout. Son seul but est de faciliter la transition entre ces langues.

Par exemple, les éléments suivants sont également corrects en Java:

;;;;;;;;;;
class X{
    ;;;;;;;;;;;;;;
} ;;;;;;;;;;;;;;;

Un point-virgule est simplement traité comme une déclaration vide qui ne fait rien.

Voici une citation de la spécification, paragraphe 7.6:

Supplémentaire ";" Les jetons apparaissant au niveau des déclarations de type dans une unité de compilation n'ont aucun effet sur la signification de l'unité de compilation. Les points-virgules parasites sont autorisés dans le langage de programmation Java uniquement en tant que concession aux programmeurs C++ habitués à placer ";" après une déclaration de classe . Ils ne doivent pas être utilisés dans le nouveau code Java.

Comme vous le voyez, c’est vraiment réservé aux gars comme vous :).

Vous pouvez même utiliser une ligne de points-virgules comme séparation visuelle de Nice. Cependant, je déconseille fortement cela. Mais cela pourrait être bon pour se vanter. Par exemple.:

class X {
   // Member variables
   private int i;

   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   // Constructors
   X(){}

   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   // Methods
   void foo(){}    

}
7
gexicide

Je pense que c'est un style suivi qui hérite de C:

struct A
{ 
    unsigned a;
    unsigned b;
};

Ou vous pouvez utiliser:

struct A
{ 
    unsigned a;
    unsigned b;
}A1,A2;
0
Pythoner