2010-02-08 10 views
18

Trong Java, lớp bên trong có thể truy cập các thành viên riêng của lớp kèm theo. Nhưng lớp ngoài có thể truy cập các thành viên riêng của lớp bên trong không? Điều này là không phân biệt cho dù lớp bên trong là tĩnh hay không. Tôi nghĩ rằng điều này là không đúng nhưng đoạn mã sau dường như biên dịch và làm việc tốt.Trong các lớp lồng nhau Java, các lớp kèm theo có thể truy cập các thành viên private của các lớp bên trong không?

public class Outer { 
    class Inner { 
     private int i = 0; 
     private Inner() {} 
    } 

    public static void main(String[] args) { 
     Outer o = new Outer(); 
     Outer.Inner oi = o.new Inner(); 
     oi.i = 10; 
    } 
} 
+1

Trông như tôi mong đợi. Ngoại trừ bạn có nghĩa là oi.i = 10; có? – Ben

+1

Nhân bản: http://stackoverflow.com/questions/1801718/outer-java-class-is-able-to-access-inner-class-private-members – finnw

+3

Tôi không hiểu. Mã ngay tại đây. Tôi biết đầu ra. Tôi biết nó hoạt động. Tôi muốn hiểu lý do đằng sau nó. Bạn có nghĩ câu hỏi này không xứng đáng với câu trả lời không? – user236215

Trả lời

23

Vâng, được rồi. Từ JLS, section 6.6.1:

Ngược lại, nếu các thành viên hoặc constructor được khai báo private, sau đó truy cập được phép khi và chỉ khi nó xảy ra trong cơ thể của lớp cấp cao nhất (§7.6) mà có chứa khai báo thành viên hoặc nhà xây dựng.

Bạn thậm chí có thể tham khảo thành viên riêng của loại lồng nhau X trong một loại lồng nhau khác Y miễn là chúng chia sẻ một lớp cấp cao nhất.

Ở cấp độ mã byte, tôi tin rằng điều này được thực hiện bằng cách thêm các phương thức truy cập gói tổng hợp.