2011-10-31 29 views
5
interface Test { 
public void test(); 
} 

public class TestMain { 
private String h = "AAA"; 

public static void main(String[] args) { 
    TestMain t = new TestMain(); 
} 

public TestMain() { 
    Test t = new Test() { 
     public void test() { 
      System.out.println(h); 
     } 
    }; 

    t.test(); 
} 

} 

Nguồn trên hoạt động tốt.Lớp ẩn danh Java và biến riêng tư có thể truy cập

Nhưng tôi nghĩ biến 'h' không thể truy cập được từ lớp ẩn danh. Tôi cần biết lý do tại sao nó hoạt động tốt.

Cảm ơn tất cả sự giúp đỡ của bạn trước!

Trả lời

7

Mỗi trường hợp của một lớp bên trong không tĩnh có trường hợp kèm theo - một thể hiện của lớp ngoài mà nó gắn với nó thông qua biến tham chiếu được lưu trữ trong đối tượng lớp bên trong. Tất cả các thành viên của cá thể kèm theo có sẵn cho đối tượng lớp bên trong thông qua tham chiếu đó.

Trình biên dịch sẽ quan tâm thêm biến tham chiếu, tất nhiên, cũng như một số hàm truy cập đặc biệt mà đối tượng lớp bên trong có thể sử dụng để truy cập các thành viên riêng của đối tượng lớp bên ngoài. Bạn có thể thấy các hàm truy cập này bằng cách tháo lớp bên ngoài bằng cách sử dụng javap -c.

-1

Lớp lồng nhau là thành viên của lớp kèm theo. Các lớp lồng nhau không tĩnh (các lớp bên trong) có quyền truy cập vào các thành viên khác của lớp bao quanh, ngay cả khi chúng được khai báo riêng. Các lớp lồng nhau tĩnh không có quyền truy cập vào các thành viên khác của lớp kèm theo.

+1

Lớp lồng nhau tĩnh không có quyền truy cập vào thành viên tĩnh riêng tư của lớp bao quanh. –

+0

Yea đó là chính xác, tôi có nghĩa là "không có quyền truy cập vào các thành viên không tĩnh của lớp kèm theo" – PaganSensei

+0

@SandeepRajeev: vẫn không đúng. Cho một cá thể của lớp bao quanh - tức là, nếu nó nhận một đối số là một đối số phương thức, hoặc tạo một tham số riêng của nó - một lớp lồng nhau tĩnh có thể truy cập các thành viên riêng của cá thể đó. –

1

Nguyên tắc cơ bản để xác định khả năng tiếp cận với các thành viên tư nhân, theo section 6.6.1 of the Java Language Specification:

[I] f thành viên hoặc constructor được khai báo là 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 bao quanh khai báo của thành viên hoặc hàm tạo.

Các vấn đề liên quan