2009-02-27 14 views
11

Ai đó có thể giải thích cho tôi sự khác biệt giữa các lớp protected/publicBên trong là gì?Lớp học bên trong được bảo vệ/công cộng

Tôi biết rằng public các lớp bên trong là tránh càng nhiều càng tốt (như được giải thích trong số article) này.

Nhưng từ những gì tôi có thể biết, không có sự khác biệt giữa việc sử dụng protected hoặc public công cụ sửa đổi.

Hãy xem ví dụ sau:

public class Foo1 { 
public Foo1() { } 

protected class InnerFoo { 
    public InnerFoo() { 
    super(); 
    } 
} 
} 

...

public class Foo2 extends Foo1 { 
public Foo2() { 
    Foo1.InnerFoo innerFoo = new Foo1.InnerFoo(); 
} 
} 

...

public class Bar { 
public Bar() { 
    Foo1 foo1 = new Foo1(); 
    Foo1.InnerFoo innerFoo1 = foo1.new InnerFoo(); 

    Foo2 foo2 = new Foo2(); 
    Foo2.InnerFoo innerFoo2 = foo2.new InnerFoo(); 
} 
} 

Tất cả điều này biên dịch và có giá trị cho dù Tôi tuyên bố InnerFooprotected hoặc public.

Tôi đang thiếu gì? Vui lòng chỉ cho tôi một trường hợp có sự khác biệt khi sử dụng protected hoặc public.

Cảm ơn.

Trả lời

19

Bộ sửa đổi truy cập protected sẽ hạn chế quyền truy cập từ các lớp khác với các lớp trong cùng một gói và các lớp con của nó.

Trong ví dụ được hiển thị, publicprotected sẽ có cùng tác dụng, vì chúng nằm trong cùng một gói.

Để biết thêm thông tin về công cụ sửa đổi truy cập, trang Controlling Access to Members of a Class của The Java Tutorials có thể được quan tâm.

+0

Ok. Tôi thấy sự nhầm lẫn của tôi. Bởi vì các lớp bên trong giống như các thành viên của lớp bao quanh, tôi đã suy nghĩ về các thành viên được bảo vệ. Cảm ơn. –

+1

@bruno conde: các lớp được bảo vệ * là * giống như các thành viên được bảo vệ. –

+0

Nói cách khác, "được bảo vệ" trong Java, dù được áp dụng cho các thành viên hay các lớp bên trong, khác với C++ và C#. Nó cấp quyền truy cập vào các lớp khác trong cùng một gói (không gian tên). – Qwertie

1

Bạn chỉ có thể nghĩ rằng lớp bên trong được bảo vệ là thành viên được bảo vệ, vì vậy nó chỉ truy cập vào lớp, gói, phân lớp nhưng không cho thế giới.

Ngoài ra, đối với lớp outter, chỉ có hai bộ sửa đổi truy cập cho nó. Chỉ công khai và gói.