Un de mes enfants prend Java au lycée et l'a fait à l'un de ses tests:
Lequel des éléments suivants est un identifiant valide en Java?
une.
123java
b.main
c.java1234
ré.{abce
e.)whoot
Il a répondu b et s'est trompé.
J'ai examiné la question et j'ai fait valoir qu'il main
s'agit d' un identifiant valide et qu'il aurait dû être exact.
Nous avons examiné la spécification Java pour les identificateurs et cela a renforcé ce point. Nous avons également écrit un exemple de programme qui avait une variable appelée main
, ainsi qu'une méthode. Il a créé une réfutation écrite qui comprenait la référence de la documentation Java, le programme de test et l'enseignant l'a ignoré et dit que la réponse est toujours incorrecte.
Un main
identifiant est -il valide?
la source
Réponses:
Ceci compile, et une fois exécuté, émet cette sortie:
La séquence de caractères
main
est un identifiant, pas un mot-clé ou un mot réservé.La section pertinente du JLS est 3.8 :
La séquence de caractères
main
correspond à la description ci-dessus et ne figure pas dans la liste de mots - clés de la section 3.9 .(La séquence de caractères
java1234
est également un identifiant, pour les mêmes raisons.)la source
main
aussi;)main
est un identifiant java valide et l'enseignant a tort.La documentation pertinente se trouve dans la spécification du langage Java, ici:
Chapitre 3. "Structure lexicale", section 3.8. "Identifiants":
https://docs.oracle.com/javase/specs/jls/se10/html/jls-3.html#jls-3.8
Ça dit:
Ce qui signifie que vous pouvez prouver qu'il s'agit d'un identifiant valide soit par:
la source
Comme les autres réponses le disent
main
est un identifiant Java valide , ainsi quejava1234
.Je suppose que la confusion vient du fait que la
main(String[])
méthode est souvent utilisée comme point d'entrée par la JVM 1 . Cependant, cela ne signifie pas que le jetonmain
lui-même ne peut pas être utilisé comme identifiant 2 .Les spécifications le disent et les déclarations suivantes sont également valables:
Un champ:
Une variable locale:
Une méthode:
Une classe (bien qu'un nom de classe commençant par des minuscules soit déconseillé):
Un paquet:
1: Comme indiqué dans les commentaires, la spécification JVM elle-même ne prescrit aucune méthode particulière comme point d'entrée, mais l'
java
outil largement utilisé utilise souvent une telle méthode comme point d'entrée.2: J'éviterais généralement de créer une méthode principale autre que
main(String[])
.la source
main
n'est pas le point d'entrée de la JVM. C'est le point d'entrée que l'java
outil utilise pour exécuter des applications. D'autres outils (conteneurs de servlets, par exemple) utilisent d'autres points d'entrée.java
outil ne nécessite pas demain(String[])
méthode si la classe principale étend javafx.application.Application .Cela compile très bien sur Java 1.8 ...
... et une fois exécuté produit la sortie:
la source
static main
méthode avec des paramètres différents?package main;
!J'ai jeté tout ce que j'ai pu dessus, et ça semble marcher. Je dirais que principal est un identifiant valide.
la source
public static void main(main...Main)
( manque un espace ) ne peut pas fonctionner, n'est-ce pas?Comment
main
ne pas être utilisé comme identifiant alors qu'il est utilisé comme identifiant pour déclarer la méthode "principale"?Pour un idiome aussi classique:
main
n'est pas un mot clé et il ne serait probablement jamais un mot clé en Java pour des raisons évidentes de rétrocompatibilité.À propos de la question, est
main
un bon identifiant?Premièrement: valide pour un compilateur ne signifie pas nécessairement bon.
Par exemple,
java1234
option qui est proposée est également un identifiant valide mais cela devrait vraiment être évité.main
a une signification très particulière et importante: elle est utilisée comme méthode de point d'entrée des classes et des jars exécutés par lajava
ligne de commande.Utiliser
main
pour un nom de méthode qui ne remplit pas les critères à utiliser par lajava
ligne de commande serait tout simplement trompeur tout en l'utilisant comme nom de variable ou un nom de classe pourrait avoir un sens.Par exemple, la définition de la classe représentant le point d'entrée d'une application comme
Main
classe de l'application est acceptable et donc son utilisation en tant que nom de variable, comme:De manière générale, en Java, plusieurs caractères ou "mots" sont considérés comme des identifiants valides pour le compilateur mais sont fortement déconseillés pour être utilisés dans le code client (mais le code généré peut le faire: classes imbriquées par exemple) comme non lisibles et / ou vraiment trompeur.
Par exemple, cela pourrait être valide pour le compilateur:
Mais nous ne voulons pas:
Object
notre classe comme cela est défini dansjava.lang
(1).main()
si ne remplit pas les critères à utiliser par lajava
ligne de commande (2).Object.toString()
méthode (3)._
,$
ou tout caractère surprenant / sans signification qui va à l'encontre des conventions de nommage partagées (4).la source
main
pourrait être un mot-clé qui ne peut être utilisé que comme nom pour une méthode statique avec une signature appropriée (ou autre). Notez que les appels de super classe utilisentsuper
d'une manière qui le fait ressembler à un identifiant:super(foo);
etsuper.foo
, maissuper
EST un mot-clé (et avant l'ajout de génériques, c'était la seule façon de l'utiliser (dont je me souviens)).main
un mot-clé dans une nouvelle version de java, cela signifie que tout code qui utilise main comme nom de méthode (ou tout nom de membre) ne sera plus compilé. L'utilisation desuper
génériques n'a aucun effet secondaire dans le code existant car les génériques n'existaient pas à ce moment.main
c'est toujours un meilleur identifiant quejava1234
. L'utiliser pour une méthode "régulière" serait trompeur, mais je n'aurais aucun problème à nommer une variablemain
, si c'est en fait le principal élément de ma méthode.java1234
est tout simplement horrible, les noms devraient être descriptifs ...main
si la fonction que je regardais faisait quelque chose avec les données principales de l'eau. Je vomirais si jamais je voyaisjava1234
du code de production (et je prie pour qu'il n'y ait pas 1233 autres variables avec le préfixejava
).Est-ce un identifiant valide? Oui.
Est-ce un bon identifiant? Pas si vous l'utilisez pour autre chose que la méthode qui démarre au lancement de la JVM.
Un autre identifiant valide est-il répertorié? Oui.
Les instructions du test indiquaient-elles de choisir la meilleure réponse?
la source
main
est un identifiant tolérable que je nejava1234
pourrais l'être. Considérons, par exemple, une base de code fonctionnant avec des données d'alimentation en eau (conduites d'eau).main
est un identifiant parfaitement fin n'importe où en dehors du domaine étroit de l'application Java standard. Il peut s'agir du nom d'un champ d'une classe représentant un menu fixe. Ou une<main>
section d'un document dans un générateur HTML.java1234
, d'autre part, est à peu près aussi terrible que les identifiants.main
est parfaitement valide car, d' après les documents :la source
la source
L'enseignant a commis une erreur mineure en supposant que main n'est pas un identifiant valide ou en formulant simplement la question de manière erronée. Il voulait peut-être dire "un bon identifiant".
Mais ignorer les arguments de votre fils et décourager ainsi son approche scientifique de vérification de la littérature pertinente (spécification Java) et de réalisation d'une expérience (écriture d'un exemple de programme) est exactement le contraire de ce qu'un enseignant est censé faire.
la source
main
est beaucoup plus souvent un «bon» identificateur que cejava1234
ne serait le cas. Alors même là, l'enseignant a tort. ;)Les deux
main
etjava123
sont valides des identificateurs, principal n'est pas un mot - clé réservé de sorte qu'il est parfaitement acceptable d'utiliser, pour autant que le test va vous devez avoir obtenu un point ou un demi - point au moins.la source
Doit être un seul mot. Autrement dit, les espaces ne sont pas autorisés.
Exemple: mangoprice est valide mais le prix de la mangue n'est pas valide.
Doit commencer par une lettre (alphabet) ou un trait de soulignement ou $.
Exemple: prix, _ prix et $ prix sont des identifiants valides.
Ne doit pas être un mot clé de Java car le mot clé a une signification particulière pour le compilateur.
Exemple: classe ou vide, etc.
Ne doit pas commencer par un chiffre mais le chiffre peut être au milieu ou à la fin.
Exemple: 5mangoescost n'est pas valide et mango5cost et mangocost5 sont valides.
La longueur d'un identifiant en Java peut être de 65 535 caractères et tous sont significatifs. Les identificateurs sont sensibles à la casse. Cela signifie que la mangue et la mangue sont traitées différemment. Peut contenir toutes les lettres majuscules ou minuscules ou un mélange.
IDENTIFICATEUR : ce sont des noms de classe, des noms de méthode, des noms de variables ...
Comme principal n'est pas un mot réservé et selon l'explication ci-dessus pour définir un identifiant, principal est un identifiant valide et java1234 également.Les options restantes ne sont pas valides en raison de l'explication ci-dessus.
la source