2011-01-18 8 views
6

ho cercato di dichiarare una classe come mostrato sottonon può dichiarare Public static final String s = new String ("123") all'interno di una classe interna

class Outer{ 
    private final class Inner{ 
     public static final String s1 = new String("123"); 
     public static final byte[] bytes = new byte[]{0x00, 0x01}; 

     public static final String s2 = "123"; 
     public static final byte byte1 = 0x02; 
    } 
} 

Nel s1 codice sopra e byte non si compilano ma s2 e byte1 compile. Se metto l'intera dichiarazione costante nella classe esterna, funziona bene. cosa mi manca? Qualsiasi aiuto?

+1

Scommetto che la riga s2 sarebbe stata * public static final String s2 = "123"; * –

+0

@Cadrian, @Guido Spiacenti, errore di copia di copia, aggiornamento della domanda – Manoj

risposta

12

Leggere la specifica del linguaggio Java, 3a ed, §8.1.3.

Una classe interna è una classe nidificata che non è esplicitamente o implicitamente dichiarata statica. Le classi interne potrebbero non dichiarare le inizializzazioni statiche (§8.7) o le interfacce membro .

Questo è il motivo non è possibile dichiarare nuovapublic static final String s1 = new String("123");.

classi interne non possono dichiarare membri statici, a meno che siano in fase di compilazione campi costanti (§15.28).

Questo spiega perché si può fare public static final String s2 = "123";

Una classe innestata statica può avere membri statici.

+0

Non si dovrebbe mai dire 'nuova stringa (" 123 "), comunque: è ridondante, lento e uno spreco di memoria mentre dichiari due variabili e ne usi solo una. Basta usare la stringa letterale: '" 123 "'. – CajunLuke

+0

Puoi spiegare * perché * JLS ha questa restrizione? –

0

cf specifica linguaggio Java, seconda edizione, §8.1.2

Una classe interna è una classe annidata che non è esplicitamente o implicitamente dichiarato statico. classi interne non possono dichiarare inizializzatori statici (§8.7) o interfacce membri

0

classi interne sono state progettate per lavorare nel contesto della classe esterna, penso che le variabili statiche avrebbero rompere questa regola.

8.1.2 Inner Classes and Enclosing Instances

una classe interna è una classe annidata che non è esplicitamente o implicitamente dichiarato statico. Le classi interne potrebbero non dichiarare inizializzatori statici (§8.7) o interfacce membro . Le classi interne possono non dichiarare membri statici, a meno che siano campi costanti in fase di compilazione (§15.28).