一部のドキュメントで使用されている「パッケージプライベート」という用語と、「デフォルトアクセス」の使用について少し混乱しています。package-privateとdefaultアクセスは両方ともprotectedと同義ではありませんか?
default
修飾子を(インターフェース)メソッドの前に置くことが可能であるため、Java 8では少し混乱する可能性があります。しかし、それはアクセス修飾子ではありません!すべてのアクセス修飾子とそのスコープは、この表で明確に視覚化されています。
一部のドキュメントで使用されている「パッケージプライベート」という用語と、「デフォルトアクセス」の使用について少し混乱しています。package-privateとdefaultアクセスは両方ともprotectedと同義ではありませんか?
default
修飾子を(インターフェース)メソッドの前に置くことが可能であるため、Java 8では少し混乱する可能性があります。しかし、それはアクセス修飾子ではありません!すべてのアクセス修飾子とそのスコープは、この表で明確に視覚化されています。
回答:
はい、それはほとんど同じです。protected修飾子は、メンバーが(package-privateと同様に)独自のパッケージ内でのみアクセスでき、さらに、別のパッケージ内のそのクラスのサブクラスによってのみアクセスできることを指定します。
public static final
、メソッドはpublic abstract
、列挙または注釈はpublic
、そしてクラスはそれですpublic static
「デフォルト」のアクセス修飾子(明示的に指定されていないもの)は「package-private」です。これは、同じパッケージ内のものだけがアクセスできることを意味します。ただし、同じパッケージ内にあることは、クラス間の継承関係については何も意味しません。これは純粋に命名規則です。
「保護されている」とは、同じパッケージ内のクラスだけでなく、サブクラスも(それらのサブクラスがどのパッケージにあるかに関係なく)アクセスできることを意味します。
クラスのデフォルトアクセスはpackage-privateですが、インターフェースメンバーのデフォルトアクセスは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-privateとdefaultアクセスは同義語です。オブジェクトは、クラスが同じパッケージにあるオブジェクトの保護されたメンバーにもアクセスできます。オブジェクトは、パッケージに関する条件なしで、スーパークラスの保護されたメンバーにアクセスすることもできます。具体的な例として:
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
}
Java言語仕様から
- 6.6.5例:デフォルトアクセスフィールド、メソッド、およびコンストラクターアクセス修飾子public、protected、privateのいずれも指定されていない場合、クラスメンバーまたはコンストラクターは、クラスが含まれるクラスの宣言を含むパッケージ全体からアクセスできます。メンバーが宣言されていますが、クラスメンバーまたはコンストラクターは他のパッケージではアクセスできません。
パブリッククラスにデフォルトのアクセス権を持つメソッドまたはコンストラクターがある場合、このメソッドまたはコンストラクターは、このパッケージの外部で宣言されたサブクラスからアクセスまたは継承されません。