Jedno z moich dzieci bierze Javę w szkole średniej i miało to na jednym ze swoich testów:
Który z poniższych elementów jest prawidłowym identyfikatorem w Javie?
za.
123java
b.main
do.java1234
re.{abce
mi.)whoot
Odpowiedział b i pomylił się.
Spojrzałem na pytanie i argumentowałem, że main
jest to prawidłowy identyfikator i że powinien był mieć rację.
Przyjrzeliśmy się specyfikacji Java dla identyfikatorów i to wzmocniło ten punkt. Napisaliśmy również przykładowy program, który miał zmienną o nazwie main
, a także metodę. Stworzył pisemne obalenie, które zawierało odniesienie do dokumentacji Java, program testowy i nauczyciel zignorowali go i stwierdzili, że odpowiedź jest nadal nieprawidłowa.
Czy main
prawidłowy identyfikator?
java
language-lawyer
main
identifier
Gary Bak
źródło
źródło
Odpowiedzi:
To kompiluje, a po uruchomieniu emituje następujące dane wyjściowe:
Sekwencja znaków
main
jest identyfikatorem, a nie słowem kluczowym ani słowem zastrzeżonym.Istotne odcinek JLS 3.8 :
Sekwencja znaków
main
pasuje do powyższego opisu i nie znajduje się na liście słów kluczowych w Rozdziale 3.9 .(Sekwencja znaków
java1234
jest również identyfikatorem, z tych samych powodów.)źródło
main
;)main
jest prawidłowym identyfikatorem Java, a nauczyciel się myli.Odpowiednia dokumentacja znajduje się w specyfikacji języka Java, tutaj:
Rozdział 3. „Struktura leksykalna”, sekcja 3.8. „Identyfikatory”:
https://docs.oracle.com/javase/specs/jls/se10/html/jls-3.html#jls-3.8
To mówi:
Co oznacza, że możesz udowodnić, że jest to prawidłowy identyfikator poprzez:
źródło
Jak podają inne odpowiedzi
main
jest poprawnym identyfikatorem Java , a takżejava1234
.Myślę, że zamieszanie wynika z faktu, że
main(String[])
JVM 1 często stosuje tę metodę jako punkt wejścia . Nie oznacza to jednak, żemain
sam token nie może być używany jako identyfikator 2 .Specyfikacja tak mówi i obowiązują również następujące deklaracje:
Pole:
Zmienna lokalna:
Metoda:
Klasa (chociaż nazwa klasy zaczynająca się od małych liter jest odradzana):
Paczka:
1: Jak zauważono w komentarzach, sama specyfikacja JVM nie nakazuje żadnej konkretnej metody jako punktu wejścia, ale powszechnie używane
java
narzędzie często stosuje taką metodę jako punkt wejścia.2: Zasadniczo unikałbym tworzenia głównej metody innej niż
main(String[])
.źródło
main
nie jest punktem wejścia dla JVM. Jest to punkt wejścia, któregojava
narzędzie używa do uruchamiania aplikacji. Inne narzędzia (na przykład kontenery serwletów) używają innych punktów wejścia.java
Narzędzie nie wymagamain(String[])
metody, jeśli głównym klasa rozszerza javafx.application.Application .Kompiluje się dobrze w Javie 1.8 ...
... a po wykonaniu generuje dane wyjściowe:
źródło
static main
metodę o różnych parametrach?package main;
!Rzuciłem w to wszystko, co mogłem, i wydaje się, że działa. Powiedziałbym, że main jest prawidłowym identyfikatorem.
źródło
public static void main(main...Main)
( brak spacji ) nie może działać, prawda?Jak
main
nie można go użyć jako identyfikatora, gdy jest używany jako identyfikator do deklarowania metody „głównej”?Dla takiego klasycznego idiomu:
main
nie jest słowem kluczowym i prawdopodobnie nigdy nie będzie słowem kluczowym w Javie z oczywistych powodów kompatybilności retro.Jeśli chodzi o pytanie, czy jest
main
to dobry identyfikator?Po pierwsze: poprawne dla kompilatora niekoniecznie musi oznaczać dobre.
Na przykład
java1234
proponowana opcja jest również prawidłowym identyfikatorem, ale tak naprawdę należy jej unikać.main
ma bardzo szczególne i ważne znaczenie: jest stosowany jako metoda wejścia klas i słoików wykonywanych przezjava
wiersz poleceń.Użycie
main
nazwy metody, która nie spełnia kryteriów używanych wjava
wierszu poleceń, byłoby po prostu mylące, gdy używałaby jej jako nazwy zmiennej lub nazwy klasy może mieć sens.Na przykład zdefiniowanie klasy reprezentującej punkt wejścia aplikacji jako
Main
klasy aplikacji jest dopuszczalne, dlatego też użycie jej jako nazwy zmiennej, takiej jak:Ogólnie rzecz biorąc, w Javie wiele znaków lub „słów” jest uważanych za prawidłowe identyfikatory kompilatora, ale zdecydowanie odradza się ich stosowanie w kodzie klienta (ale generowany kod może to zrobić: na przykład klasy zagnieżdżone) jako nieczytelne i / lub naprawdę wprowadzające w błąd.
Na przykład może to być poprawne dla kompilatora:
Ale nie chcemy:
Object
naszą klasę zgodnie z definicją wjava.lang
(1).main()
jeśli nie spełnia kryteriów, które mają być użyte wjava
linii poleceń (2).Object.toString()
metodę (3)._
,$
ani żadnych zaskakujących / unmeaningful znaki, które wykraczają przeciwko współdzielonych konwencji nazewnictwa (4).źródło
main
może to być słowo kluczowe, które może być użyte jedynie jako nazwa metody statycznej z odpowiednim podpisem (lub czymkolwiek innym). Zauważ, że wywołania superklasy używająsuper
w taki sposób, że wyglądają jak identyfikator:super(foo);
isuper.foo
, alesuper
JEST słowem kluczowym (i zanim dodano ogólne, był to jedyny sposób, aby go użyć (co pamiętam)).main
jako słowo kluczowe w nowej wersji Java, oznacza to, że żaden kod, który używa main jako nazwy metody (lub dowolnych nazw członków) nie będzie się kompilował. Zastosowaniesuper
w generics nie ma żadnego efektu ubocznego w istniejącym kodzie, ponieważ generics w tym czasie nie istniał.main
wciąż jest to lepszy identyfikator niżjava1234
. Używanie go do „zwykłej” metody byłoby mylące, ale nie miałbym problemu z nazwaniem zmiennejmain
, jeśli w rzeczywistości jest to główna rzecz w mojej metodzie.java1234
jest po prostu okropny, imiona powinny być opisowe ...main
gdyby funkcja, na którą patrzyłem, działała z danymi wodnymi. Zwymiotowałbym, gdybym kiedykolwiek zobaczyłjava1234
w kodzie produkcyjnym (i modliłbym się, żeby nie było 1233 innych zmiennych z prefiksemjava
).Czy to prawidłowy identyfikator? Tak.
Czy to dobry identyfikator? Nie, jeśli używasz go do czegoś innego niż metoda, która zaczyna się przy uruchomieniu JVM.
Czy wymieniono inny prawidłowy identyfikator? Tak.
Czy instrukcje testowe mówiły, aby wybrać najlepszą odpowiedź?
źródło
main
jest to akceptowalny identyfikator, niż ja w którymjava1234
by to był. Rozważmy na przykład bazę kodu działającą z danymi dotyczącymi zaopatrzenia w wodę (sieć wodociągowa).main
jest idealnie dokładnym identyfikatorem w dowolnym miejscu poza wąską domeną zwykłej aplikacji Java. Może to być nazwa pola w klasie reprezentującej ustawione menu. Lub<main>
część dokumentu w kreatorze HTML.java1234
z drugiej strony jest tak straszne, jak tylko dostają identyfikatory.main
jest całkowicie poprawny, ponieważ z dokumentów :źródło
źródło
Nauczyciel popełnił niewielki błąd, zakładając, że main nie jest prawidłowym identyfikatorem lub po prostu źle sformułował pytanie. Prawdopodobnie chciał powiedzieć „dobry identyfikator”.
Ale ignorowanie argumentów swoich synów, a tym samym zniechęcanie do jego naukowego podejścia do sprawdzania odpowiedniej literatury (specyfikacji Java) i przeprowadzania eksperymentu (pisanie przykładowego programu) jest dokładnym przeciwieństwem tego, co powinien zrobić nauczyciel.
źródło
main
znacznie częściej jest to „dobry” identyfikator niżjava1234
byłby. Więc nawet tam nauczyciel się myli. ;)Zarówno
main
ijava123
są ważne identyfikatory, główny nie jest zarezerwowanym słów kluczowych, dlatego całkowicie dopuszczalne do użycia, o ile test idzie powinien dotarłeś punkt lub pół punktu przynajmniej.źródło
Powinno być pojedyncze słowo. Oznacza to, że spacje nie są dozwolone.
Przykład: mangopryka jest ważna, ale cena mango jest nieprawidłowa.
Powinien zaczynać się od litery (alfabetu), podkreślenia lub symbolu $.
Przykład: cena, cena i cena w USD są ważnymi identyfikatorami.
Nie powinno być słowem kluczowym Java, ponieważ słowo kluczowe ma specjalne znaczenie dla kompilatora.
Przykład: klasa lub nieważne itp.
Nie powinien zaczynać się od cyfry, ale cyfra może znajdować się na środku lub na końcu.
Przykład: 5mangoescost jest niepoprawny, a mango5cost i mangocost5 są prawidłowe.
Długość identyfikatora w Javie może wynosić 65 535 znaków i wszystkie są znaczące. W identyfikatorach rozróżniana jest wielkość liter. Oznacza to, że zarówno mango, jak i mango są traktowane inaczej. Może zawierać wszystkie wielkie lub małe litery lub mieszaninę.
IDENTYFIKATOR : są to nazwy klas, nazwy metod, nazwy zmiennych ...
Ponieważ main nie jest słowem zastrzeżonym i zgodnie z powyższym wyjaśnieniem dotyczącym definiowania identyfikatora main jest ważnym identyfikatorem i java1234 również. Pozostałe opcje nie są ważne z powodu powyższego wyjaśnienia.
źródło