Thilo menambahkan jawaban yang bagus untuk pertanyaan pertama Anda, "Bagaimana ini mungkin?" Saya ingin menguraikan sedikit pada pertanyaan kedua: Mengapa perilaku ini diizinkan?
Sebagai permulaan, mari kita menjadi sangat jelas bahwa perilaku ini tidak terbatas pada kelas dalam, yang menurut definisi adalah tipe bersarang non-statis. Perilaku ini diperbolehkan untuk semua tipe bersarang, termasuk enum bersarang dan antarmuka yang harus statis dan tidak dapat memiliki instance terlampir. Pada dasarnya, model ini adalah penyederhanaan ke pernyataan berikut: Kode bersarang memiliki akses penuh ke kode terlampir - dan sebaliknya.
Jadi mengapa? Saya pikir contoh menggambarkan hal itu dengan lebih baik.
Pikirkan tubuh dan otak Anda. Jika Anda menyuntikkan heroin ke lengan Anda, otak Anda menjadi tinggi. Jika wilayah amygdala otak Anda melihat apa yang dia yakini sebagai ancaman terhadap keselamatan pribadi Anda, katakanlah tawon misalnya, ia akan membuat tubuh Anda berbalik dan berlari ke bukit tanpa Anda "berpikir" dua kali tentang hal itu.
Jadi, otak adalah bagian intrinsik dari tubuh - dan anehnya, sebaliknya. Menggunakan kontrol akses antara entitas yang terkait erat seperti kehilangan klaim hubungan mereka. Jika Anda benar-benar membutuhkan kontrol akses, maka Anda perlu memisahkan kelas lebih banyak menjadi unit yang benar-benar berbeda. Sampai saat itu, mereka adalah unit yang sama. Contoh pendorong untuk studi lebih lanjut adalah dengan melihat bagaimana Java Iterator
biasanya diimplementasikan.
Akses tanpa batas dari kode penutup ke kode bersarang membuatnya, sebagian besar, agak tidak berguna untuk menambahkan pengubah akses ke bidang dan metode dari tipe bersarang. Melakukan hal itu menambah kekacauan dan mungkin memberikan rasa aman yang salah untuk pendatang baru bahasa pemrograman Java.