2011-01-26 2 views
27

Trong Java tutorial "Defining an Interface" có thể, nó nóiJava hướng dẫn nói rằng tôi có thể có một giao diện gói tin, nhưng tôi không

Nếu bạn không xác định rằng giao diện là public, giao diện của bạn sẽ có thể truy cập duy nhất các lớp được định nghĩa trong cùng một gói với giao diện.

Tuy nhiên, đây

interface PPInterface { 
    void foo(); 
    void bar(); 
} 

class NewClass implements PPInterface { 
    void foo() {} 
    void bar() {} 
} 

tạo ra lỗi biên dịch trong NewClass bởi vì tôi đang 'cố gắng gán đặc quyền truy cập yếu; được công khai '. Vì vậy, các tài liệu là sai, hoặc tôi đã làm một cái gì đó sai, hoặc tôi misinterpreted tài liệu?

Tôi cho rằng tôi không phải sử dụng giao diện-- Tôi thích nó vì nó giữ mọi thứ được sắp xếp hợp lý.

Trả lời

48

Chính giao diện có thể là gói riêng tư, không phải là phương pháp trong đó. Bạn có thể định nghĩa một giao diện chỉ có thể được sử dụng (theo tên) trong gói nó được định nghĩa trong, nhưng các phương thức của nó là public giống như tất cả các phương thức giao diện. Nếu một lớp thực hiện giao diện đó, các phương thức mà nó định nghĩa phải là public. Điều quan trọng ở đây là đó là giao diện loại không hiển thị bên ngoài gói, không phải là phương pháp. Các tài liệu không chính xác, bởi vì việc sử dụng các phương thức được định nghĩa trong giao diện không giống như việc sử dụng giao diện.

Cũng lưu ý rằng khi xác định giao diện, không thêm public trước khi định nghĩa phương thức không thay đổi bất cứ điều gì vì các phương pháp hoàn toàn là public.

Nếu (các) lớp mà bạn đã triển khai giao diện tự là gói riêng, thì số public của phương thức giao diện rõ ràng không phải là vấn đề. Bạn cũng có thể, tất nhiên, sử dụng một lớp trừu tượng thay vì một giao diện nếu vấn đề thừa kế đơn không nhận được theo cách của bạn:

abstract class Whatever { 
    abstract void foo(); 
    abstract void bar(); 
} 
+2

Ugh, chúng ta lại bị buộc phải hack xung quanh với các lớp trừu tượng do giới hạn truy cập hạn chế của 'interface' http: // stackoverflow của Java.com/questions/5376970/protected-in-interfaces/5377300 # 5377300 – Pacerier

+0

"đó là loại giao diện không hiển thị bên ngoài gói, không phải là phương pháp". Làm cách nào tôi có thể truy cập các phương thức công khai của một Loại vô hình? Tôi vẫn không hiểu mục đích của các phương thức công cộng là gì trong một gói - lớp riêng (hoặc giao diện ..). –

+0

@KayayTugay: Các phương thức giao diện luôn là 'công khai', cho dù có hiệu quả thiết thực hay không. Nhưng nếu, ví dụ, bạn có một kiểu gói riêng để thực hiện một số giao diện công cộng hoặc mở rộng một số kiểu công khai, các phương thức 'public' trên lớp/giao diện mà ghi đè lên các phương thức từ kiểu công khai có thể sử dụng từ bên ngoài gói. – ColinD

4

tôi nghĩ (mặc dù tôi có thể là sai về điều này) rằng các đặc quyền truy cập yếu được thảo luận ở đây là dành cho các foo()bar() phương pháp trong NewClass. Tất cả các phương thức giao diện hoàn toàn là public, nhưng trong NewClass bạn đã để chúng ở chế độ riêng tư theo gói, bảo đảm yếu hơn public. Thay đổi NewClass để đọc

class NewClass implements PPInterface{ 
    public void foo() {} 
    public void bar() {} 
} 

lẽ sẽ sửa lỗi này.

+0

Thật vậy ... nhưng tôi không muốn sửa chữa nó .. Tôi muốn chúng được gói riêng tư. Các tài liệu đã được khá rõ ràng rằng bạn có thể làm điều này, do đó, các tài liệu là sai? Hay nó có nghĩa là chỉ các đối tượng trong gói có thể thực hiện giao diện, nhưng các phương thức vẫn còn công khai? (Tôi đoán đó là câu trả lời) – Pete

+3

@ Pete- Tôi nghĩ có hai vấn đề riêng biệt ở đây. Bằng cách rời khỏi giao diện gói riêng, các lớp duy nhất có thể tham chiếu giao diện phải nằm trong cùng một gói. Tuy nhiên, các phương thức được định nghĩa bởi giao diện đó được ngầm công khai, và vì vậy bất kỳ lớp nào thực hiện giao diện cũng phải có các hàm riêng biệt được đánh dấu riêng tư. Vì vậy, không, các tài liệu không chính xác - chỉ có hai mức hiển thị riêng biệt khi phát. – templatetypedef