2010-11-02 6 views
8

Tôi có một lớp lồng nhau "tĩnh riêng" trong Java. Ý nghĩa của các công cụ sửa đổi truy cập cho các trường và phương thức bên trong lớp này là gì? Tôi đã thử cả công khai và riêng tư mà không ảnh hưởng đến đơn đăng ký của tôi.Các công cụ sửa đổi truy cập bên trong một lớp lồng nhau tĩnh riêng trong Java

public class MyList<T>{ 
    private static class Node{ // List node 
     private Object item; 
     private Node next; 
     private Node prev; 

     private Node(Node next){ 
      this.next = next; 
     } 

     private static Node doStuff(){} 
    } 
} 
+1

bạn có thể đăng mã của bạn cũng như giả định của bạn những gì bạn areexpecting –

Trả lời

4

Hai loại lớp lồng nhau: 1. Static (lồng lớp) và 2. Non-tĩnh (hay còn gọi là lớp bên trong)

Bây giờ, lớp Outer, MyList có thể truy cập tất cả các thành viên của bên trong lớp Node, nhưng bạn thực sự sử dụng các truy cập specifiers cho các thành viên của lớp Node (lồng nhau lớp) khi bạn muốn hạn chế của một số bên ngoài lớp truy cập nó.

Thú đọc: Source1, Source2

10

Bởi vì nó là một lớp lồng nhau, tất cả mọi thứ trong Node có thể được truy cập bởi MyList<T>, bất kể modifier truy cập; bởi vì nó là một lớp lồng nhau riêng tư, không có gì được khai báo lần đầu tiên trong Node sẽ hiển thị bên ngoài MyList<T>.

Vì vậy, một trường hợp mà công cụ sửa đổi truy cập có thể quan trọng là các phương pháp ghi đè lên phương thức siêu lớp (ví dụ: toString()). Bạn không thể giảm khả năng hiển thị của một phương thức ghi đè. toString() phải luôn được khai báo công khai để lớp biên dịch.

Cũng cần lưu ý rằng khi các thành viên riêng được truy cập bởi lớp bên ngoài, trình biên dịch tạo ra một phương pháp tổng hợp (tôi tin rằng phạm vi gói). Phương thức tổng hợp này chỉ hiển thị trong tệp .class của lớp lồng nhau.

+2

Câu trả lời hay. Tôi muốn thêm rằng các modifier trên lớp bên trong chỉ quan trọng nếu lớp bên trong không phải là 'private'. – Jorn

+0

"khi các thành viên riêng được truy cập bởi lớp bên ngoài, trình biên dịch tạo ra một phương pháp tổng hợp". Liệu nó có tạo ra phương thức tổng hợp khi chỉ có các thành viên 'private static' của lớp lồng nhau tĩnh được truy cập từ lớp bên ngoài? Giả sử, tất cả các thành viên tĩnh (bao gồm các thành viên của các lớp lồng nhau tĩnh) được giải quyết trong thời gian biên dịch. – andrybak

+0

@andrybak Trình biên dịch Java có thể nhận ra khi một thành viên riêng bên trong được truy cập bởi lớp bên ngoài, bất kể nó có tĩnh hay không. Nó chỉ tạo ra phương thức accessor tổng hợp khi cần thiết. – ILMTitan