[英]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*/
(作為評論)有一種短暫的時尚。 同樣,在那個時候你可以聲明像同步類這樣的東西,盡管同樣沒有實際的語義效果。
它們都與“受保護”不同,后者擴展到其他包中的派生類。
- 6.6.5 示例:默認訪問字段、方法和構造函數如果沒有指定 public、protected 或 private 訪問修飾符,則類成員或構造函數可在包含類的聲明的整個包中訪問聲明了成員,但在任何其他包中都無法訪問類成員或構造函數。
如果公共類具有具有默認訪問權限的方法或構造函數,則此方法或構造函數不能被在此包外聲明的子類訪問或繼承
default和package-private都是相同的,這意味着它們可以被任何類使用,直到它們在同一個包中。
包私有術語實際上是由private修飾符的含義命名的,因為私有意味着它僅在同一個類中可用,並且在同一個包中或不在同一個包中,其他類或子類都不能訪問它。
因此package-private 的意思與default相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.