簡體   English   中英

“包私有”成員訪問是否與默認(無修飾符)訪問同義?

[英]Isn't "package private" member access synonymous with the default (no-modifier) access?

我對某些文檔使用的術語“私有包”以及“默認訪問”的用法感到有些困惑。 包私有和默認訪問不是受保護的同義詞嗎?

是的,幾乎一樣。 protected 修飾符指定該成員只能在其自己的包中訪問(與包私有一樣),此外,還可以由另一個包中其類的子類訪問。

“默認”訪問修飾符(沒有明確給出的訪問修飾符)是“package-private”,這意味着只有同一個包中的東西才能訪問它們。 然而,在同一個包中並不意味着類之間的繼承關系——這純粹是一種命名約定。

“受保護”意味着不僅同一個包中的類,而且子類(無論這些子類在哪個包中)都可以訪問它。

的默認訪問權限是包私有的,但是接口成員的默認訪問權限是公共的。

例如

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 { }
}

接口的默認訪問規則與類不同。

包私有和默認訪問是同義詞。 對象還可以訪問其類在同一包中的對象的受保護成員。 對象也可以訪問其超類的受保護成員,而無需對其包進行任何條件。 作為一個具體的例子:

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     
    }

“包私有”和默認訪問是相同的。 在 1.1.2/3 左右的編譯器早期版本中,'package' 是一個允許的修飾符,但被忽略,這意味着與沒有修飾符相同,即 'package private'。 不久之后,在這種情況下放置/*package*/ (作為評論)有一種短暫的時尚。 同樣,在那個時候你可以聲明像同步類這樣的東西,盡管同樣沒有實際的語義效果。

它們都與“受保護”不同,后者擴展到其他包中的派生類。

來自Java 語言規范

  • 6.6.5 示例:默認訪問字段、方法和構造函數如果沒有指定 public、protected 或 private 訪問修飾符,則類成員或構造函數可在包含類的聲明的整個包中訪問聲明了成員,但在任何其他包中都無法訪問類成員或構造函數。

如果公共類具有具有默認訪問權限的方法或構造函數,則此方法或構造函數不能被在此包外聲明的子類訪問或繼承

defaultpackage-private都是相同的,這意味着它們可以被任何類使用,直到它們在同一個包中。

包私有術語實際上是由private修飾符的含義命名的,因為私有意味着它僅在同一個類中可用,並且在同一個包中或不在同一個包中,其他類或子類都不能訪問它。

因此package-private 的意思與default相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM