İç sınıf nesnesi
Aşağıdaki kodun davranışını anlayamadım.
Benim beklentim, her iki println()yöntemde de 100 basmasıydı. Sonuç neden farklı?
getX()Metodu iç sınıfta uncomment edersem , o zaman println(metotların çıktısı aynıdır ki bu 100'dür.
Farklı davranışların nedenini çözemedim. Lütfen anlamama yardım et.
public class Foo {
public static void main(String[] args) {
MyOuter outerObj = new MyOuter();
MyOuter.MyInner innerObj = outerObj.new MyInner();
innerObj.setX();
System.out.println("x: " + innerObj.getX()); //x: 3
System.out.println("x: " + outerObj.getX()); //x: 100
}
}
class MyOuter {
private int x = 3;
public int getX() { return x; }
class MyInner extends MyOuter {
public void setX(){ x = 100; }
// public int getX() { return x; }
}
}
Yanıtlar
Gönderen MyInnerbireyin perspektifinden, iki vardır private int xburada oyun alanları:
- Bir alan
super.xdevralınanMyOuter, ancak ulaşılmaz o kadar açıklandığı içinprivate, veMyInnerbir miras nesne olarak bu alanı erişemez. - Bir alan
MyOuter.this.xgelen çevreyeMyOuter(çünkü -instanceMyInnerbir (statik olmayan) iç sınıf, bu her zaman çevreleyen örneğine bağlıMyOutererişilebilir).
Yöntem setX()içinde MyInnercan not miras alan erişmek super.xböylece alanını erişir MyOuter.this.xve onun değerlerini ayarlar 100. Çevredeki üzerine bir ardışık çağrı MyOuter's getX()dönecektir 100.
Çağrı innerObj.getX()(miras alınır MyOuterve erişebilir super.x), miras alınan alanın değerini döndürür super.x(hala başlangıç değerine sahiptir 3).
Yönteminden kaldırır extends MyOuterve getX()-metodunu dahil edersek MyInner, kod beklendiği gibi davranır.
Aslında MyInnermiras alan erişemez private xilk başta kafa karıştırıcı olmakla davranış anahtar kelimenin davranışı doğrultusunda aslında protectedolduğu gibi sınıflar devralan statik mehthods bağlamında Hariharan tarafından bu yazı tartışılan