Quyền truy cập thành viên "gói riêng tư" có đồng nghĩa với quyền truy cập mặc định (không có bổ sung)?


94

Tôi hơi bối rối về thuật ngữ "gói riêng tư" mà một số tài liệu sử dụng, cùng với việc sử dụng "quyền truy cập mặc định". Không phải gói riêng tư và quyền truy cập mặc định đều đồng nghĩa với được bảo vệ?


7
Vì vậy, không có từ khóa nào để thể hiện quyền truy cập cá nhân trọn gói? Nó chỉ được ngụ ý bằng cách không chỉ định công cụ sửa đổi truy cập?
TurtleToes

5
TurtleToes, đúng vậy, và điều này có thể hơi khó hiểu trong Java 8, vì thực sự có thể đặt defaultmodifier trước các phương thức (interface). Nhưng đó không phải là một công cụ sửa đổi quyền truy cập! Tất cả các công cụ sửa đổi truy cập và phạm vi của chúng được hiển thị rõ ràng trong bảng này .
aioobe

1
bạn cũng có thể kiểm tra bảng hướng dẫn từ docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
childno͡.de

Câu trả lời:


136

Vâng, nó gần giống nhau. Công cụ sửa đổi được bảo vệ chỉ định rằng thành viên chỉ có thể được truy cập trong gói của chính nó (như với gói-private) và ngoài ra , bởi một lớp con của lớp nó trong một gói khác.


Có rất nhiều câu trả lời hay ở đây, nhưng câu này giải thích nó đơn giản và đi vào vấn đề, vì vậy tôi chấp nhận nó
TurtleToes

23
Cần lưu ý rằng quyền truy cập mặc định cho thành viên giao diện không phải là gói riêng tư.
Peter Lawrey

1
@PeterLawrey Ồ? Vậy thì quyền truy cập mặc định cho các thành viên giao diện là gì?
ArtOfWarfare,

8
Giá trị mặc định cho một lĩnh vực là public static final, đối với một phương pháp là public abstract, đối với một enum hoặc chú thích là publicvà cho một lớp nópublic static
Peter Lawrey

36

Công cụ sửa đổi quyền truy cập "mặc định" (công cụ sửa đổi không ai trong số chúng được cung cấp rõ ràng) là "gói-riêng tư", có nghĩa là chỉ những thứ trong cùng một gói mới có thể truy cập chúng. Tuy nhiên, ở trong cùng một gói không có nghĩa là gì về mối quan hệ kế thừa giữa các lớp - đó hoàn toàn là một quy ước đặt tên.

"Được bảo vệ" có nghĩa là không chỉ các lớp trong cùng một gói, mà cả các lớp con (bất kể các lớp con đó nằm trong gói nào) sẽ có thể truy cập nó.


cũng từ ngữ của bạn về bảo vệ là sai .. Tương tự trường hợp gói lớp cũng có thể truy cập vào các thành viên bảo vệ ..
Gursel Koca

15

Quyền truy cập mặc định cho các lớp là gói-riêng tư, tuy nhiên quyền truy cập mặc định cho các thành viên giao diện là công khai.

ví dụ

public interface I {
   int A = 1;
// same as
   public static final int A = 1;

   void method();
// same as
   public abstract void method();

   class C { }
// same as
   public static class C { }
}

Các quy tắc truy cập mặc định cho giao diện không giống với các lớp.


3

Gói-riêng tư và quyền truy cập mặc định là từ đồng nghĩa. Một đối tượng cũng có thể truy cập thành viên được bảo vệ của các đối tượng có các lớp trong cùng một gói. Một đối tượng cũng có thể truy cập thành viên được bảo vệ của các lớp cha của nó mà không cần điều kiện về gói của chúng. Như một ví dụ cụ thể:

package ab;

class A {
   protected void foo() {}
   void dd(){}
}

class C {
   void aa(){
       A a = new A();
       a.foo(); //legal
       a.dd();  //legal
   }
}


package sub;

class D extends A{
      void ac(){
         foo(); //legal ..
         dd();  //illegal.. because dd has default access.. 
      }

class E {
    void ee(){
       A a = new A();
       a.foo(); //illegal
       a.dd();  //illegal     
    }

downvoter có thể giải thích những gì là sai trong lời giải thích này .. trừ từ ngữ xấu ..?
Gursel Koca

6
Tôi không phải là người tán thành, nhưng tôi đoán là vì nó không hoàn toàn đúng; một đối tượng có thể truy cập các thành viên được bảo vệ của các lớp cha, bất kể gói nào.
Adrian Petrescu

1

'Gói riêng tư' và quyền truy cập mặc định giống nhau. Trong các bản phát hành đầu tiên của trình biên dịch khoảng 1.1.2 / 3, 'package' là một bổ ngữ được phép, nhưng bị bỏ qua, có nghĩa là giống như không có sửa đổi, tức là 'package private'. Ngay sau đó, đã có một xu hướng ngắn hạn để đưa /*package*/(như một bình luận) vào những tình huống như vậy. Tương tự tại thời điểm đó, bạn có thể khai báo những thứ như các lớp được đồng bộ hóa, mặc dù một lần nữa không có hiệu ứng ngữ nghĩa thực sự.

Không cái nào trong số chúng giống với 'protected', mở rộng cho các lớp dẫn xuất trong các gói khác.


0

Từ thông số ngôn ngữ Java

  • 6.6.5 Ví dụ: Trường, phương thức và hàm tạo truy cập mặc định Nếu không có công cụ sửa đổi truy cập nào là công khai, bảo vệ hoặc riêng tư được chỉ định, một thành viên lớp hoặc hàm tạo có thể truy cập được trong toàn bộ gói chứa khai báo lớp mà lớp đó thành viên được khai báo, nhưng thành viên lớp hoặc hàm tạo không thể truy cập trong bất kỳ gói nào khác.

Nếu một lớp công khai có một phương thức hoặc hàm tạo có quyền truy cập mặc định, thì phương thức hoặc hàm tạo này không thể truy cập hoặc kế thừa bởi một lớp con được khai báo bên ngoài gói này


2
Nhưng những gì về "gói riêng tư". Điều đó không có trong JLS.
Tom Hawtin - tackline vào

-1

defaultpackage-private đều giống nhau, có nghĩa là cả hai đều có thể được sử dụng bởi bất kỳ lớp nào cho đến khi chúng nằm trong cùng một gói.

Các gói tin dài, trên thực tế, được gọi bởi ý nghĩa của riêng modifier như tin phương tiện nó có sẵn chỉ trong cùng một lớp và không có lớp học hoặc các lớp con khác có thể truy cập vào nó trong cùng một gói hoặc không có.

Do đó, gói-riêng có nghĩa là giống như mặc định .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.