2015-03-24 12 views
7

So che le variabili di metodo sono memorizzate nella pila della memoria ma leggermente confuse su final. Avevo sfogliato molti link come this non riuscivo a capire bene? qui di seguito è l'esempio di inner class in cui si accede final variabili e locali non-final variabili non sono come vengono memorizzati in stackDove si trova la variabile finale locale nel metodo memorizzato (Stack/Heap)?

class Employee { 
public void getAddress(){ 
final int location = 13; 
int notFinalVar = 13; 
    class Address { 
     System.out.println (location); 
     System.out.println (notFinalVar); // compiler error 
    } 
} 

Aggiornamento: Poco fa è venuto a sapere campi nascosti chiamato synthetic field (inner class heap memory area) in cui la copia delle variabili finali è memorizzata, quindi significa che finalmente le variabili finali sono memorizzate in Stack memory Area?

risposta

12

Leggendo alcune risposte di SO e articoli, la mia comprensione è:

La risposta è pila. Tutte le variabili locali (finali o meno) memorizzate nello stack e escono dall'ambito quando l'esecuzione del metodo è terminata.

Ma sulla variabile finale JVM prendere questi come una costante in quanto non cambieranno dopo l'avvio. E quando una classe interna tenta di accedervi, il compilatore crea una copia di quella variabile (non quella stessa variabile) nell'heap e crea un campo sintetico all'interno della classe interna, quindi anche quando l'esecuzione del metodo è superiore a è accessibile perché l'interno la classe ha la sua copia.

so does it finally means that final variables are stored in finally Stack memory Area?

variabile finale memorizzato anche nella pila ma la copia quella variabile che una classe interna sono memorizzati in mucchio.


campo sintetico sono stati depositati che in realtà non esiste nel codice sorgente ma compilatore creano quei campi in alcune classi interne per rendere quelli campo accessibili. Nella parola semplice campo nascosto.

Riferimenti:

How does marking a variable as final allow inner classes to access them?

Cannot refer to a non-final variable inside an inner class defined in a different method

Mystery of Accessibility in Local Inner Classes

+1

Sì: è a causa di questa copia che Java richiede di dichiarare queste variabili come definitiva. –

+0

è possibile elaborare su 'campo sintetico sintetico' nella classe interna –

+1

'campo sintetico sintetico' era un errore di battitura è' campo sintetico'. Ho aggiornato la mia risposta @BhargavModi – Saif

Problemi correlati