2013-04-17 7 views
6

Tôi tự hỏi nếu nó tạo ra bất kỳ sự khác biệt nào nếu một phương thức là công cộng hoặc gói được bảo vệ trong một lớp được bảo vệ gói.Có lý do nào cho các phương thức công khai trong một lớp được bảo vệ gói không?

class Example { 
    public void test() {} 
} 

thay vì

class Example { 
    void test() {} 
} 

Tôi đoán khả năng hiển thị tối đa được cho bởi lớp. Và một phương pháp chỉ có thể làm giảm khả năng hiển thị và tăng khả năng hiển thị không có hiệu lực.

Nhưng đó là cú pháp hợp lệ, vì vậy có lẽ tôi đã giám sát một cái gì đó?

+0

Thats một câu hỏi hay, tôi biết trong C++ theres một sự kết hợp của bảo vệ + công khai mà làm cho không có tác dụng trong thừa kế, tôi đoán là ở đây nó có tác dụng cho các lớp trong cùng một gói. – Infested

Trả lời

5

Nếu chúng ta phân lớp Example để một lớp public, sau đó mã bên ngoài gói có thể truy cập test() phương pháp sử dụng các ví dụ lớp con nếu nó là public.

Ví dụ:

package A; 
class Example { 
    public void test() {} 
} 

package A; 
public class SubExample extends Example { 
} 

package B; 
import A.SubExample; 
class OutsidePackage { 
    public void some method(SubExample e){ 
    // Had test been defined with default access in class Example 
    // the below line would be a compilation error. 
    e.test(); 
    } 
} 
+0

Bạn có thể cho tôi một ví dụ không? Tôi không thể theo bạn. – tangens

+0

Tôi đã cố gắng xây dựng một ví dụ sử dụng sự phản chiếu. Nhưng tôi nhận được ngoại lệ 'java.lang.IllegalAccessException: Class other.Other không thể truy cập vào một thành viên của lớp example.Example với các công cụ sửa đổi "công khai". Vì vậy, có vẻ như việc bảo vệ gói của lớp bảo vệ các phương thức công khai của nó. – tangens

+0

Ví dụ tốt, cảm ơn bạn. Vì vậy, nó thực sự làm cho một sự khác biệt nếu các thành viên được gói bảo vệ hoặc công cộng! – tangens

5

Nếu Example triển khai giao diện của một loại nào đó, bạn phải đặt chúng ở chế độ công khai vì bạn không thể giảm quyền truy cập trong trường hợp đó. Tất cả các phương thức giao diện, theo mặc định, công khai.

+0

Điểm tốt. Vì vậy, bạn sẽ luôn luôn làm cho phương pháp "gói được bảo vệ" của bạn công khai khi lớp đã được bảo vệ gói? – tangens

+0

Không phải tất cả. Tôi sẽ không làm cho các nhà thầu công khai, bởi vì đó là vấn đề. – duffymo

0

Như được viết, nó không có gì. Nếu nó là một lớp con hoặc thực hiện giao diện, thì nó có thể đang thực hiện hoặc ghi đè các phương thức được khai báo công khai ở nơi khác.

+0

Thực ra, nó tạo ra sự khác biệt. Xem câu trả lời của @ noob-unchained. – tangens