Perché il punto è illegale in un identificatore Java?

-1

Sappiamo che parte di questa sintassi non verrà compilata, in particolare la riga in cui mi riferisco esplicitamente al nome della classe per una variabile.

class Main {

    static String Main.s1 ="output"; //won't compile
    static String s2 = "output";

    public static void main(String... s1) {
        System.out.println("output");
    }
}

Il Main.s1 ="output"; fornisce un errore del compilatore. Ma sappiamo che il seguente è ok:

class Main {

    static String s2 = "output";

    public static void main(String... s1) {
        System.out.println(Main.s2);
    }
}

Allo stesso modo, anche il seguente è ok.

class Main {

    static String s2 = "output";

    public static void main(String... s1) {
        Main.s2 = "baz";
        System.out.println(Main.s2);
    }
}

È solo alla dichiarazione che i compilatori si lamentano. Ho letto che ci sono queste regole per gli identificatori in Java

  • le parole riservate non possono essere utilizzate. non possono iniziare con una cifra ma
  • Le cifre
  • possono essere utilizzate dopo il primo carattere (ad esempio, nome1, n2ame lo sono valido). possono iniziare con una lettera, un carattere di sottolineatura (ad es. "_") o a simbolo del dollaro (ad es. "$").
  • non puoi usare altri simboli o spazi (ad es. "%", "^", "&", "#").

Quindi apparentemente non è legale usare un punto in un identificatore. Sono d'accordo è inutile, ma c'è un sacco di altro codice legale non necessario.

Qualche motivo per cui il punto è illegale in un identificatore Java?

    
posta Niklas Rosencrantz 11.01.2017 - 09:19
fonte

2 risposte

3

Il punto viene utilizzato per indicare la fine di un identificatore e l'inizio di un elemento secondario di tale identificatore:

package1.package2.class.innerclass.method

Quando il compilatore raggiunge ogni . , sa che ha raggiunto la fine di un identificatore e passa al successivo. Se i punti erano consentiti nei nomi, il metodo potrebbe effettivamente essere chiamato innerclass.method . Se poi hai anche una classe chiamata class.innerclass in package1.package2 e una classe chiamata innerclass in class , come può il compilatore risolvere ciò a cui ti stai riferendo?

    
risposta data 11.01.2017 - 09:40
fonte
3

La ragione è dimostrata nei tuoi secondi due esempi, renderebbe ambiguo il codice senza alcun valore reale (quanto spesso ha senso inserire un punto in un nome di variabile)

Segui questa linea

int b = Main.a

È abbastanza chiaro sotto java reale cosa significa questo; la classe Main ha un campo a e desideri impostare il valore su b.

Sotto il tuo sistema potrebbe significare che o potrebbe esserci una variabile locale chiamata Main.a . Possono esistere entrambi!

Quindi in pratica; non puoi usare il punto perché java lo sta già usando (potresti rendere più un argomento per alcuni degli altri simboli, ma non è mai una cattiva idea riservare alcuni simboli che "potresti usare", specialmente dato l'attenzione di java sulla compatibilità all'indietro )

    
risposta data 11.01.2017 - 09:34
fonte

Leggi altre domande sui tag