2017-03-28 46 views
18

Używam Java Syntax, więc to pytanie powstaje wyłącznie z ciekawości. Ten fragment kodu:Java: Dozwolone instrukcje po etykietach

http://www.google.com 
Object val = 5 <- 4; 

robi nie kompilacji, ponieważ etykieta (http) „muszą być przestrzegane przez oświadczenia”. Poniższe dwa warianty należy skompilować:

http://www.google.com 
{ Object val = 5 <- 4; } 

i

Object val; 
http://www.google.com 
val = 5 <- 4; 

W obu przypadkach, przeszedłem od deklaracji do wyrażenia. To sprawia, że ​​zastanawiam się, co dokładnie jest „oświadczenie” w Javie, ale doc stany:

Oprócz sprawozdania ekspresyjnych, istnieją dwa inne rodzaje sprawozdań: sprawozdania deklaracji oraz rachunku przepływów sterowania. Deklaracja deklarująca deklaruje zmienną.

JLS prostu mówi (na etykietach), które

identyfikator jest uznany za etykieta natychmiast zawartych Statement.

Nie mówi nic o "wyrażeniach wyrażeń".

Czy coś mi umknęło, czy jest to tylko niejasna/niepoprawna specyfikacja?

+0

Co to jest wyrażenie "" http://www.google.com "'? –

+8

@MykhayloKopytonenko To nie jest wyrażenie, to tylko jakiś tekst w komentarzu. Etykieta to 'http: ', a następnie' // 'rozpoczyna komentarz linii. Trudne trudne! :) – yshavit

+2

Kod to orzechy! –

Odpowiedz

20

Jeśli czytasz rozdział 14 JLS nieco ostrożniej, okaże się, że LocalVariableDeclarationStatement to nie Oświadczenie. Niezbyt intuicyjny z nich, prawda?

szczególności, w JLS 14.2 widzimy, że:

  • blokowym zasadniczo zawiera zero lub większą liczbę BlockStatements
  • BlockStatement jednym z:
    • LocalVariableDeclarationStatement
    • ClassDeclaration
    • Oświadczenie

Tak więc LocalVariableDeclarationStatement nie jest potomkiem Statement w hierarchii, ale raczej rodzeństwem. Oba są typami BlockStatements.

Po etykiecie musi znajdować się prawdziwe oświadczenie —, które jest podtypem BlockStatement, który nie jest ani LocalVariableDeclarationStatement, ani ClassDeclaration. Różne podtypy Oświadczenia są wymienione w 14.5. Nie znajdziesz wśród nich LocalVariableDeclarationStatement, ale znajdziesz ExpressionStatement jako podtyp StatementWithoutTrailingSubstatement.

+1

To naprawdę niezrozumiały wybór nazewnictwa. Podana sekcja jest tylko nieznacznie inna w Java 8 [JLS 14.2] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.2) (notacja dla wielu oświadczenia zmieniły się trochę na "[]", a linki zostały dodane). – Hulk

+0

Ok, JLS 14.2 dotyczy, ponieważ treść funkcji jest instrukcją blokową ... Dzięki! – Moritz