Eines meiner Kinder nimmt Java in der High School und hatte dies bei einem seiner Tests:
Welcher der folgenden Bezeichner ist in Java gültig?
ein.
123java
b.main
c.java1234
d.{abce
e.)whoot
Er antwortete b und verstand es falsch.
Ich schaute auf die Frage und argumentiert , dass main
ist ein gültiger Bezeichner und dass es richtig sein sollte.
Wir haben uns die Java- Spezifikation für Bezeichner angesehen und sie hat diesen Punkt verstärkt. Wir haben auch ein Beispielprogramm geschrieben, das eine Variable namens main
sowie eine Methode hatte. Er erstellte eine schriftliche Gegenargumentation, die die Java-Dokumentationsreferenz enthielt, das Testprogramm und der Lehrer ignorierte sie und sagte, die Antwort sei immer noch falsch.
Ist main
eine gültige Kennung?
quelle
Antworten:
Dies kompiliert und gibt bei Ausführung diese Ausgabe aus:
Die Zeichenfolge
main
ist eine Kennung, kein Schlüsselwort oder reserviertes Wort.Der relevante Abschnitt des JLS ist 3.8 :
Die Zeichenfolge entspricht
main
der obigen Beschreibung und ist nicht in der Schlüsselwortliste in Abschnitt 3.9 enthalten .(Die Zeichenfolge
java1234
ist aus den gleichen Gründen auch eine Kennung.)quelle
main
main
ist eine gültige Java-Kennung und der Lehrer ist falsch.Die entsprechende Dokumentation finden Sie in der Java-Sprachspezifikation hier:
Kapitel 3. "Lexikalische Struktur", Abschnitt 3.8. "Kennungen":
https://docs.oracle.com/javase/specs/jls/se10/html/jls-3.html#jls-3.8
Es sagt:
Dies bedeutet, dass Sie nachweisen können, dass es sich um eine gültige Kennung handelt, indem Sie:
quelle
Wie die anderen Antworten sagen
main
ist eine gültige Java-Kennung sowiejava1234
.Ich denke, die Verwirrung kommt von der Tatsache, dass die
main(String[])
Methode oft als Einstiegspunkt von der JVM 1 verwendet wird . Dies bedeutet jedoch nicht, dass das Tokenmain
selbst nicht als Bezeichner 2 verwendet werden kann .Die Spezifikationen sagen dies, und die folgenden Erklärungen sind ebenfalls gültig:
Ein Feld:
Eine lokale Variable:
Eine Methode:
Eine Klasse (obwohl von einem Klassennamen, der mit Kleinbuchstaben beginnt, abgeraten wird):
Ein Packet:
1: Wie in den Kommentaren erwähnt, schreibt die JVM-Spezifikation selbst keine bestimmte Methode als Einstiegspunkt vor, aber das weit verbreitete
java
Tool verwendet häufig eine solche Methode als Einstiegspunkt.2: Ich würde im Allgemeinen vermeiden, eine andere Hauptmethode als zu erstellen
main(String[])
.quelle
main
ist nicht der Einstiegspunkt für die JVM. Dies ist der Einstiegspunkt, über den dasjava
Tool Anwendungen ausführt. Andere Tools (z. B. Servlet-Container) verwenden andere Einstiegspunkte.java
Tool benötigt keinemain(String[])
Methode, wenn die Hauptklasse javafx.application.Application erweitert .Dies kompiliert gut auf Java 1.8 ...
... und bei Ausführung wird die Ausgabe erzeugt:
quelle
static main
Methode mit anderen Parametern hinzuzufügen ?package main;
!Ich warf alles, was ich konnte, und es scheint zu funktionieren. Ich würde sagen, main ist eine gültige Kennung.
quelle
public static void main(main...Main)
( fehlt ein Leerzeichen ) kann nicht funktionieren, oder?Wie
main
es nicht als Bezeichner verwendet werden, während es als Bezeichner zum Deklarieren der "Haupt" -Methode verwendet wird?Für solch eine klassische Sprache:
main
ist kein Schlüsselwort und würde aus offensichtlichen Gründen der Retro-Kompatibilität wahrscheinlich nie ein Schlüsselwort in Java sein.Über die Frage ist
main
eine gute Kennung?Erstens: Gültig für einen Compiler bedeutet nicht unbedingt gut.
Zum Beispiel die
java1234
ist die vorgeschlagene Option auch eine gültige Kennung, aber das sollte wirklich vermieden werden.main
hat eine ganz besondere und wichtige Bedeutung: Sie wird als Einstiegspunktmethode für Klassen und Jars verwendet, die von derjava
Befehlszeile ausgeführt werden .Die Verwendung
main
eines Methodennamens, der die von derjava
Befehlszeile zu verwendenden Kriterien nicht erfüllt, wäre nur irreführend, wenn er als Variablenname oder Klassenname verwendet wird.Beispielsweise
Main
ist es akzeptabel , die Klasse, die den Einstiegspunkt einer Anwendung darstellt, als Klasse der Anwendung zu definieren und sie daher auch als Variablennamen zu verwenden, z.Im Allgemeinen werden in Java mehrere Zeichen oder "Wörter" als gültige Bezeichner für den Compiler betrachtet, es wird jedoch dringend davon abgeraten, sie im Client-Code zu verwenden (generierter Code kann dies jedoch tun: verschachtelte Klassen zum Beispiel) als nicht lesbar und / oder wirklich irreführend.
Dies könnte beispielsweise für den Compiler gültig sein:
Aber wir wollen nicht:
Object
unsere Klasse so zu benennen , wie dies injava.lang
(1) definiert ist.main()
wenn die von derjava
Befehlszeile zu verwendenden Kriterien nicht erfüllt sind (2).Object.toString()
Methode (3) zu überladen ._
,$
oder bei einem der überraschenden / unmeaningful Zeichen , die gegen die gemeinsamen Benennungskonventionen gehen (4).quelle
main
könnte ein Schlüsselwort sein, das nur als Name für eine statische Methode mit einer geeigneten Signatur (oder was auch immer) verwendet werden kann. Beachten Sie, dass Super-Class-Aufrufe so verwendetsuper
werden, dass sie wie ein Bezeichner aussehen:super(foo);
undsuper.foo
, abersuper
IS ein Schlüsselwort (und bevor Generika hinzugefügt wurden, war dies die einzige Möglichkeit, sie zu verwenden (an die ich mich erinnern kann)).main
in einer neuen Java-Version als Schlüsselwort definiert haben , bedeutet dies, dass Code, der main als Methodennamen (oder Mitgliedsnamen) verwendet, nicht mehr kompiliert wird. Die Verwendung vonsuper
in Generika hat keine Nebenwirkungen in vorhandenem Code, da zu diesem Zeitpunkt keine Generika vorhanden waren.main
immer noch eine bessere Kennung ist alsjava1234
. Es wäre irreführend, es für eine "normale" Methode zu verwenden, aber ich hätte kein Problem damit, eine Variable zu benennenmain
, wenn es tatsächlich das wichtigste Element in meiner Methode ist.java1234
ist einfach schrecklich, Namen sollten beschreibend sein ...main
wenn die Funktion, die ich betrachtete, etwas mit Wasserhauptdaten zu tun hätte. Ich würde kotzen , wenn ich jemals sahjava1234
in der Produktion Code (und beten dort nicht 1233 andere Variablen mit dem Präfix warenjava
).Ist es eine gültige Kennung? Ja.
Ist es eine gute Kennung? Nicht, wenn Sie es für etwas anderes als die Methode verwenden, die beim Start von JVM beginnt.
Ist eine andere gültige Kennung aufgeführt? Ja.
Haben die Testanweisungen gesagt, um die beste Antwort zu wählen?
quelle
main
eine tolerierbare Kennung vorliegt, als ich kannjava1234
. Stellen Sie sich zum Beispiel eine Codebasis vor, die mit Wasserversorgungsdaten (Wasserleitungen) arbeitet.main
ist eine vollkommen feine Kennung außerhalb der engen Domäne einer einfachen Java-Anwendung. Dies kann der Name eines Feldes in einer Klasse sein, das ein festgelegtes Menü darstellt. Oder ein<main>
Abschnitt eines Dokuments in einem HTML-Builder.java1234
Auf der anderen Seite ist es ungefähr so schrecklich, wie Identifikatoren es bekommen.main
ist vollkommen gültig, weil es aus den Dokumenten :quelle
quelle
Dieser Lehrer hat einen kleinen Fehler gemacht, indem er entweder angenommen hat, dass main keine gültige Kennung ist, oder einfach die Frage falsch formuliert hat. Er wollte möglicherweise "eine gute Kennung" sagen.
Das Ignorieren der Argumente Ihrer Söhne und damit das Entmutigen seines wissenschaftlichen Ansatzes, relevante Literatur (Java-Spezifikation) zu überprüfen und ein Experiment durchzuführen (Schreiben eines Beispielprogramms), ist das genaue Gegenteil von dem, was ein Lehrer tun soll.
quelle
main
ist es viel häufiger eine "gute" Kennung als esjava1234
wäre. Selbst dort liegt der Lehrer falsch. ;)Beide
main
undjava123
sind gültige Bezeichner. Main ist kein reserviertes Schlüsselwort, daher ist es durchaus akzeptabel, es zu verwenden. Nach dem Test sollten Sie mindestens einen oder einen halben Punkt erreicht haben.quelle
Sollte ein einzelnes Wort sein. Das heißt, Leerzeichen sind nicht erlaubt.
Beispiel: Mangopreis ist gültig, aber der Mangopreis ist nicht gültig.
Sollte mit einem Buchstaben (Alphabet) oder einem Unterstrich oder einem $ -Symbol beginnen.
Beispiel: Preis, _Preis und $ Preis sind gültige Bezeichner.
Sollte kein Schlüsselwort von Java sein, da das Schlüsselwort für den Compiler eine besondere Bedeutung hat.
Beispiel: Klasse oder nichtig usw.
Sollte nicht mit einer Ziffer beginnen, sondern kann in der Mitte oder am Ende stehen.
Beispiel: 5mangoescost ist ungültig und mango5cost und mangocost5 sind gültig.
Die Länge eines Bezeichners in Java kann 65.535 Zeichen betragen und alle sind von Bedeutung. Bezeichner unterscheiden zwischen Groß- und Kleinschreibung. Das heißt, Mango und Mango werden unterschiedlich behandelt. Kann alle Groß- oder Kleinbuchstaben oder eine Mischung enthalten.
IDENTIFIER : Dies sind Klassennamen, Methodennamen, Variablennamen ...
Da main kein reserviertes Wort ist und gemäß der obigen Erklärung zum Definieren eines Bezeichners main ein gültiger Bezeichner und java1234 auch ist. Die verbleibenden Optionen sind aufgrund der obigen Erklärung nicht gültig.
quelle