2015-03-24 17 views
7

Bu yöntem değişkenlerinin bellek yığında saklandığını ancak final üzerinden biraz karışık olduğunu biliyorum. this gibi birçok bağlantıya göz attım doğru bir şekilde anlaşılamadı mı? Aşağıda final değişkenler erişilen inner class örneği olduğunu ve stackYöntemde yerel son değişken nerede (Yığın/Yığın) saklanır?

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

Güncelleme saklanır gibi yerel non-final değişkenler değildir: Hemen şimdi denilen gizli alanlar hakkında bilmek geldi synthetic field (inner class heap memory area) hangi Son değişkenlerin kopyası saklanır, sonuçta son değişkenlerin son olarak Stack memory Area nolu ortamda saklandığı anlamına gelir?

cevap

12

SO ve makalelerin bazı cevaplar okumak, My anlayış:

cevap yığını olduğunu. Tüm yerel değişken (son veya değil) yığında saklanır ve yöntem yürütme bittiğinde kapsam dışına çıkar. Ancak, son değişken JVM ile ilgili olarak, başlatıldıktan sonra değişmeyecekleri için sabit olarak kabul edilir. Ve bir iç sınıf derleyiciye erişmeye çalıştığında, bu değişkenin bir kopyasını yığının içine kopyalayın ve kendi iç sınıfının içinde bir sentetik alan yaratın, böylece metot yürütme işlemi 'un üzerindeyken bile erişilebilir çünkü sınıfın kendi kopyası var.

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

son değişkeni de istif halinde depolanır ancak kopya değişken olan bir iç sınıf yığın içinde depolanmış. aslında kaynak kodu ama derleyici yok


dosyalanır sentetik saha olanlar alanının erişilebilir hale getirmek için bazı iç sınıflarında bu alanları oluşturmak. Basit bir kelime ile gizli alanda.

Referanslar:

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

Evet: çünkü java nihai olarak bu değişkenleri bildirmek gerektirir bu kopyanın bu. –

+0

, 'sentetik sentetik alan' üzerinde iç mekan sınıfında –

+1

'sentetik sentetik alan' üzerine bir ayrıntı yazabilir. Cevabımı güncelledim @BhargavModi – Saif