Objek kelas dalam

Sep 19 2020

Saya tidak dapat memahami perilaku kode di bawah ini.

Harapan saya adalah itu harus mencetak 100 dalam kedua println()metode. Mengapa hasilnya berbeda?

Jika saya menghapus tanda komentar getX()di kelas dalam, maka output dari println() metode sama yaitu 100.

Saya tidak bisa menemukan alasan dari perilaku yang berbeda. Tolong bantu saya untuk mengerti.

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; }
    }
}

Jawaban

4 Turing85 Sep 19 2020 at 05:26

Dari MyInnerperspektif, ada dua private int xbidang yang berperan di sini:

  • Satu bidang super.xyang diwarisi dari MyOuter, tetapi tidak dapat diakses karena dideklarasikan sebagai private, dan MyInnersebagai objek yang mewarisi tidak dapat mengakses bidang ini.
  • Satu bidang MyOuter.this.xdari sorrounding MyOuter -instance (karena MyInneradalah kelas dalam (non-statis), itu selalu terikat ke instance sekitarnya MyOuter), yang dapat diakses.

Metode setX()dalam MyInnertidak dapat mengakses bidang yang diwariskan super.x, sehingga ia mengakses bidang MyOuter.this.xdan menyetel nilainya menjadi 100. Panggilan berturut-turut pada sekitarnya MyOuter's getX()akan kembali 100.

Panggilan innerObj.getX()(yang diwarisi dari MyOuterdan dapat mengakses super.x) mengembalikan nilai bidang yang diwariskan super.x(masih memiliki nilai awalnya 3).

Jika kita menghapus extends MyOuterdari dan menyertakan getX()-method in MyInner, kode akan berperilaku seperti yang diharapkan.


Fakta bahwa MyInnertidak dapat mengakses bidang yang diwariskan private xpada awalnya membingungkan, tetapi perilakunya sebenarnya sejalan dengan perilaku kata kunci protecteddalam konteks mehthod statis dalam mewarisi kelas seperti yang dibahas dalam posting ini oleh Hariharan