2015-03-24 13 views
7

Ich weiß, dass Methodenvariablen auf Stapelspeicher gespeichert werden, aber etwas verwirrt über final. Ich hatte viele Links wie this Browsing nicht richtig verstanden bekommen? unten ist das Beispiel von inner class in denen final Variablen zugegriffen werden und lokale non-final Variablen sind nicht, wie sie in stackWo ist die lokale letzte Variable in der Methode gespeichert (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 
    } 
} 

aktualisieren gespeichert sind: Gerade jetzt kam über versteckte Felder wissen, genannt synthetic field (inner class heap memory area), in dem Kopie der endgültigen Variablen werden gespeichert, bedeutet dies schließlich, dass die endgültigen Variablen schließlich in gespeichert werden?

Antwort

12

durch einige Antworten von SO Lesen und Artikel, Mein Verständnis ist:

Die Antwort ist Stapel. Alle lokalen Variablen (final oder nicht) werden im Stack gespeichert und gehen bei Ausführung der Methode nicht mehr in den Gültigkeitsbereich.

Aber über endgültige Variable JVM nehmen Sie diese als eine Konstante, da sie nicht nach dem Einleiten geändert werden. Und wenn eine innere Klasse versucht, auf sie zuzugreifen, erstellt der Compiler eine Kopie dieser Variablen (nicht diese Variable selbst) in den Heap und erstellt ein synthetisches Feld innerhalb der inneren Klasse, so dass selbst wenn die Methodenausführung über ist, da der innere zugänglich ist Klasse hat eine eigene Kopie.

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

endgültiger Variable auch im Stapel, aber die Kopie, die variable des eine innere Klasse hat im Heap gespeichert wird.


synthetisches Feld eingereicht werden, die eigentlich nicht im Quellcode existieren aber Compiler erstellen, diese Felder in einigen inneren Klassen denjenigen Bereich zugänglich zu machen. In einfachem Wort verstecktes Feld.

Referenzen:

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

Ja: es wegen dieser Kopie ist, dass Java Sie erfordert diese Variablen als endgültig zu erklären. –

+0

können Sie über 'synthetisches synthetisches Feld' in innner Klasse –

+1

'synthetisches synthetisches Feld' erarbeiten, war ein Tippfehler, den es 'synthetisches Feld' ist. Ich aktualisierte meine Antwort @BhargavModi – Saif