2015-09-22 40 views
6

perché java non consente dichiarazioni statiche con un blocco di inizializzazione statico in una classe interna non statica?Perché non si può usare un blocco di inizializzazione per una variabile statica in una classe interna?

nel seguente codice, outer2 funzionerà e inner2 non lo farà, nonostante faccia la stessa cosa. qualche idea? Non sto cercando una soluzione alternativa, sto solo cercando di capire perché java non riesce a farlo.

public class WhyUNoStatic { 
    public static final String outer1 = "snth"; // ok 
    public static final String outer2; // ok 
    static 
    { 
     outer2 = "snth"; 
    } 

    public class Inner { 
     public static final String inner1 = "snth"; // still ok! 
     public static final String inner2; // FAILURE TIME 
     static 
     { 
      inner2 = "snth"; 
     } 
    } 
} 

modifica: nota che inner1 funzionerà correttamente. non è che java proibisca le vars statiche nelle classi interne, semplicemente vieta le dichiarazioni di esse.

+2

Perché le classi interne non possono avere 'membri static' non definitivi, e' static {} 'è un membro statico. Può essere? –

+0

Java proibisce le variabili non costanti nelle classi interne. 'inner1' è una variabile costante. 'inner2' non lo è. –

risposta

2

Il JLS, Section 8.1.3 non consente questo comportamento.

Si tratta di un errore in fase di compilazione se una classe interna dichiara un inizializzatore statico (§8.7).

È un errore in fase di compilazione se una classe interna dichiara un membro che è esplicitamente o implicitamente statico, a meno che il membro non sia una variabile costante (§4.12.4).

È dichiarato tuoi static variabili final nella classe interna, che è ok, ma l'inizializzatore statico è vietato lì.

+0

E per quanto riguarda il motivo, probabilmente avrebbe ulteriormente complicato la sequenza di inizializzazione già piuttosto complicata. – biziclop

+0

sì, questo è quello che sto cercando di ottenere. perché il compilatore non può gestirlo? mi piacerebbe vedere un esempio di codice per mostrare perché è difficile per il compilatore affrontare questo ... – acushner

2

Vedi JLS Chapter 8

classi interne non può dichiarare inizializzatori statici (§8.7) o utente interfacce, o si verifica un errore di compilazione.

È possibile dichiarare una classe annidata invece

public static class Inner {...}