2015-01-09 10 views
5

JLS 8.1.3 fornisce la regola relativa alle variabili che non sono dichiarate in una classe interna ma utilizzate nella classe.Utilizzo di una variabile locale non finale all'interno di una classe interna

Qualsiasi variabile locale, parametro formale, o il parametro eccezioni utilizzato ma non dichiarate in una classe interna devono essere dichiarati finale o essere efficacemente finale (§4.12.4), o di un errore di compilazione si verifica quando si tenta l'uso di .

Un esempio:

class A{ 
    void baz(){ 
     int i = 0; 
     class Bar{ int j = i; } 
    } 

    public static void main(String[] args){ 
    } 
} 

DEMO

Perché il codice compilato? Abbiamo usato la variabile locale non finale nella classe interna che non è stata dichiarata lì.

risposta

2

Variabile i definita all'interno del metodo baz è efficacemente finale perché il valore della variabile i non viene modificato altrove. Se si modifica

void baz(){ 
     int i = 0; 
     i = 2; 
     class Bar{ int j = i; } 
    } 

Il codice non riuscirà a compilare perché variabile i non è più effictively finale, ma solo se si dichiara la variabile ie l'inizializzarlo in un'altra linea, il codice verrà compilato perché la variabile è effictively final

void baz(){ 
     int i; 
     i = 2; 
     class Bar{ int j = i; } 
    } 
1

i è effettivamente definitivo, poiché non viene mai modificato. Come lei stesso ha citato il JLS, la classe interna può utilizzare efficacemente variabili finali.

1

Perché i è effettivamente definitivo in quanto non modificato in baz.

Problemi correlati