一部のドキュメントで使用されている「パッケージプライベート」という用語と、「デフォルトアクセス」の使用法について少し混乱しています。パッケージ化されたプライベートアクセスとデフォルトアクセスは、どちらも保護と同義ではありませんか?
はい、ほぼ同じです。 protected修飾子は、メンバーが(package-privateの場合のように)独自のパッケージ内でのみアクセスできること、およびさらにが別のパッケージのクラスのサブクラスによってアクセスできることを指定します。
「デフォルト」アクセス修飾子(明示的に指定されていないもの)は「package-private」です。これは、同じパッケージ内のものだけがそれらにアクセスできることを意味します。ただし、同じパッケージに含まれていても、クラス間の継承関係については何も意味しません。これは純粋に命名規則です。
「保護」とは、同じパッケージ内のクラスだけでなく、サブクラス(それらのサブクラスがどのパッケージにあるかに関係なく)もアクセスできることを意味します。
classesのデフォルトアクセスはpackage-privateですが、interfaceメンバーのデフォルトアクセスはpublicです。
例えば.
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*/
(コメントとして)そのような状況では。同様に、同期クラスなどを宣言することもできましたが、実際のセマンティック効果はありませんでした。
どちらも「保護」と同じではなく、他のパッケージの派生クラスに拡張されます。
から Java言語仕様
- 6.6.5例:デフォルトアクセスフィールド、メソッド、およびコンストラクタアクセス修飾子public、protected、またはprivateのいずれも指定されていない場合、クラスメンバーまたは、クラスメンバが宣言されているクラスの宣言を含むパッケージ全体でコンストラクタにアクセスできますが、他のパッケージではクラスメンバまたはコンストラクタにアクセスできません。
パブリッククラスにデフォルトのアクセス権を持つメソッドまたはコンストラクターがある場合、このメソッドまたはコンストラクターは、このパッケージの外部で宣言されたサブクラスからアクセスまたは継承されません