Thilo thêm một câu trả lời hay cho câu hỏi đầu tiên của bạn "Làm thế nào điều này có thể?". Tôi muốn giải thích một chút về câu hỏi thứ hai: Tại sao hành vi này được cho phép?
Đối với người mới bắt đầu, chúng ta hãy hoàn toàn rõ ràng rằng hành vi này không giới hạn ở các lớp bên trong, mà theo định nghĩa là các kiểu lồng nhau không tĩnh. Hành vi này được cho phép đối với tất cả các loại lồng nhau, bao gồm các enum và giao diện lồng nhau phải tĩnh và không thể có một thể hiện kèm theo. Về cơ bản, mô hình là một sự đơn giản hóa theo tuyên bố sau: Mã lồng nhau có toàn quyền truy cập vào mã kèm theo - và ngược lại.
Vậy, tại sao sau đó? Tôi nghĩ rằng một ví dụ minh họa điểm tốt hơn.
Hãy nghĩ về cơ thể và bộ não của bạn. Nếu bạn tiêm heroin vào cánh tay, não của bạn sẽ cao lên. Nếu vùng amygdala trong não của bạn thấy những gì anh ta tin là mối đe dọa đối với sự an toàn cá nhân của bạn, ví dụ như một con ong bắp cày, anh ta sẽ khiến cơ thể bạn quay ngược lại và chạy lên đồi mà bạn không "nghĩ" về điều đó.
Vì vậy, bộ não là một phần nội tại của cơ thể - và thật kỳ lạ, cách khác cũng vậy. Sử dụng kiểm soát truy cập giữa các thực thể có liên quan chặt chẽ như vậy sẽ từ bỏ yêu cầu về mối quan hệ của họ. Nếu bạn cần kiểm soát truy cập, thì bạn cần tách các lớp thành nhiều đơn vị thực sự khác biệt. Cho đến lúc đó, họ là cùng một đơn vị. Một ví dụ lái xe cho các nghiên cứu tiếp theo sẽ là xem xét cách Java Iterator
thường được triển khai.
Truy cập không giới hạn từ mã kèm theo đến mã lồng nhau, phần lớn, khá vô dụng khi thêm các sửa đổi truy cập vào các trường và phương thức của loại lồng nhau. Làm như vậy là thêm lộn xộn và có thể cung cấp một cảm giác an toàn sai lầm cho những người mới sử dụng ngôn ngữ lập trình Java.