İç sınıf nesnesi

Sep 19 2020

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

4 Turing85 Sep 19 2020 at 05:26

Gönderen MyInnerbireyin perspektifinden, iki vardır private int xburada oyun alanları:

  • Bir alan super.xdevralınan MyOuter, ancak ulaşılmaz o kadar açıklandığı için private, ve MyInnerbir miras nesne olarak bu alanı erişemez.
  • Bir alan MyOuter.this.xgelen çevreye MyOuter (çünkü -instance MyInnerbir (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