「パッケージプライベート」メンバーアクセスは、デフォルトの(変更なしの)アクセスと同義ではありませんか?


94

一部のドキュメントで使用されている「パッケージプライベート」という用語と、「デフォルトアクセス」の使用について少し混乱しています。package-privateとdefaultアクセスは両方ともprotectedと同義ではありませんか?


7
それで、パッケージのプライベートアクセスを表現するためのキーワードはまったくありませんか?これは、アクセス修飾子を指定しないことによってのみ暗示されますか?
TurtleToes

5
TurtleToesそうです。実際には、default修飾子を(インターフェース)メソッドの前に置くことが可能であるため、Java 8では少し混乱する可能性があります。しかし、それはアクセス修飾子ではありません!すべてのアクセス修飾子とそのスコープは、この表で明確に視覚化されています
aioobe 2015年

1
あなたはまた、からチュートリアル表チェックかもしれないdocs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
childno͡.de

回答:


136

はい、それはほとんど同じです。protected修飾子は、メンバーが(package-privateと同様)独自のパッケージ内でのみアクセスでき、さらに、別のパッケージ内のそのクラスのサブクラスによってのみアクセスできることを指定します。


ここには多くの良い答えがありましたが、これはそれを簡単かつ要点で説明したので、受け入れます
TurtleToes

23
インターフェースメンバーのデフォルトアクセスパッケージプライベートではないことに注意してください。
Peter Lawrey、2011年

1
@PeterLawreyあら?では、インターフェイスメンバーのデフォルトのアクセスは何ですか?
ArtOfWarfare 2012年

8
フィールドのデフォルトはpublic static final、メソッドはpublic abstract、列挙または注釈はpublic、そしてクラスはそれですpublic static
Peter Lawrey

36

「デフォルト」のアクセス修飾子(明示的に指定されていないもの)は「package-private」です。これは、同じパッケージ内のものだけがアクセスできることを意味します。ただし、同じパッケージ内にあることは、クラス間の継承関係については何も意味しません。これは純粋に命名規則です。

「保護されている」とは、同じパッケージ内のクラスだけでなく、サブクラスも(それらのサブクラスがどのパッケージにあるかに関係なく)アクセスできることを意味します。


よく保護についてのあなたの言葉遣いは...間違って...同じパッケージのクラスのインスタンスはまた、保護されたメンバーにアクセスすることができている
Gursel Koca

15

クラスのデフォルトアクセスは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 { }
}

インターフェースのデフォルトのアクセス規則は、クラスの場合と同じではありません。


3

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     
    }

反対投票者はこの説明の何が間違っているのかを説明できますか?..悪い言葉遣いを除いて..
Gursel Koca

6
私は賛成派ではありませんが、それは正しくないからだと思います。オブジェクトは、パッケージに関係なく、スーパークラスの保護されたメンバーにアクセスできます。
Adrian Petrescu

1

「パッケージプライベート」とデフォルトのアクセスは同じです。1.1.2 / 3前後のコンパイラの初期リリースでは、「package」は許可された修飾子でしたが、無視されました。つまり、修飾子なしと同じ、つまり「package private」です。その直後に/*package*/、そのような状況に(コメントとして)置くための短命の方法がありました。同様に、そのときも、同期されたクラスなどを宣言できましたが、実際の意味上の影響はありませんでした。

どちらも、他のパッケージの派生クラスに拡張される「保護」と同じではありません。


0

Java言語仕様から

  • 6.6.5例:デフォルトアクセスフィールド、メソッド、およびコンストラクターアクセス修飾子public、protected、privateのいずれも指定されていない場合、クラスメンバーまたはコンストラクターは、クラスが含まれるクラスの宣言を含むパッケージ全体からアクセスできます。メンバーが宣言されていますが、クラスメンバーまたはコンストラクターは他のパッケージではアクセスできません。

パブリッククラスにデフォルトのアクセス権を持つメソッドまたはコンストラクターがある場合、このメソッドまたはコンストラクターは、このパッケージの外部で宣言されたサブクラスからアクセスまたは継承されません。


2
しかし、「パッケージプライベート」についてはどうでしょう。それはJLSにはありません。
トムホーティン-タックライン

-1

defaultpackage-privateはどちらも同じです。つまり、同じパッケージに入るまで、どちらのクラスでもどちらも使用できます。

パッケージプライベート用語は、実際には、の意味で呼ばれているプライベートとして修飾子民間それだけ同じクラスで利用可能で、他のクラスまたはサブクラスが同じパッケージ内またはなしでそれにアクセスしないことを意味します。

したがって、package-privatedefaultと同じ意味です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.