Objek kelas dalam
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
Dari MyInnerperspektif, ada dua private int xbidang yang berperan di sini:
- Satu bidang
super.xyang diwarisi dariMyOuter, tetapi tidak dapat diakses karena dideklarasikan sebagaiprivate, danMyInnersebagai objek yang mewarisi tidak dapat mengakses bidang ini. - Satu bidang
MyOuter.this.xdari sorroundingMyOuter-instance (karenaMyInneradalah kelas dalam (non-statis), itu selalu terikat ke instance sekitarnyaMyOuter), 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