継承 Java のパブリック、プロテクト、パッケージプライベート、プライベートの違いは何ですか?




パッケージプライベート 使いどころ (20)

Javaでは、アクセス修飾子、つまりデフォルト(パッケージプライベート)、 publicprotectedprivate各アクセス修飾子を使用するタイミングについて明確なルールがありますか? classinterfaceを作成し、継承を処理しますか?


しばしば私は、実際の類推を生み出すことによって可能になった言語の基本概念を覚えていることを認識しました。Javaのアクセス修飾子を理解するための私の類推は次のとおりです。

あなたは大学の学生で、週末にあなたを訪ねる友人がいるとしましょう。大学の創設者の大きな像がキャンパスの中央にあるとします。

  • 彼をキャンパスに連れて行くと、あなたとあなたの友人が最初に気がついたのはこの像です。つまり、キャンパス内を歩く人は、大学の許可なく像を見ることができます。この像はPUBLICになります。

  • 次に、あなたはあなたの寮にあなたの友人を連れて行きたいですが、そのためには彼を訪問者として登録する必要があります。つまり、キャンパス内のさまざまな建物に入るためにアクセスパス(あなたと同じ)を取得します。これは彼のアクセスカードを保護されたものにするでしょう。

  • あなたの友人はキャンパスWiFiにログインしたいが、それを行うための資格はありません。彼がオンラインになる唯一の方法は、彼とあなたのログインを共有することです。(大学に行く学生はすべて、これらのログイン資格情報も持っていることに注意してください)。これにより、あなたのログイン情報がNO MODIFIERになります。

  • 最後に、あなたの友人はウェブサイトに掲載されている学期の進捗報告書を読みたいと思っています。ただし、キャンパスのWebサイトのこのセクションにアクセスするには、すべての生徒がログインしてください。これにより、これらの資格情報がPRIVATEになります。

お役に立てれば!


それはすべてカプセル化に関するものです(またはJoe Phillips氏が述べたように、知識ほとんどありません)。

最も制限の厳しい(プライベート)ものから始め、あまり制限の少ない修飾子が必要かどうかを確認してください。

私たちはすべてprivateやpublicなどのメソッドとメンバの修飾子を使用しますが、コードを論理的に整理するためのパッケージを使用するのはあまり開発者がほとんどありません。

たとえば、機密性の高いセキュリティメソッドを「セキュリティ」パッケージに入れることができます。次に、このパッケージのセキュリティ関連のコードのいくつかにアクセスするパブリッククラスを配置しますが、他のセキュリティクラスはパッケージをプライベートに保ちます。したがって、他の開発者は(変更者を変更しない限り)このパッケージの外部から公開されているクラスのみを使用することができます。これはセキュリティ機能ではありませんが、使用方法をガイドします。

Outside world -> Package (SecurityEntryClass ---> Package private classes)

もう1つのことは、お互いに多く依存するクラスが同じパッケージで終わる可能性があり、依存関係が強すぎると最終的にリファクタリングまたはマージされる可能性があるということです。

逆に、すべてをpublicとして設定すると、アクセスする必要があるかどうかが分かりません。javadoc(コンパイラを介して何も強制しない...)を書くことにつながる可能性があります。


Davidの答えは各アクセス修飾子の意味を提供します。それぞれをいつ使うべきかについては、すべてのクラスと外部使用(API)用の各クラスのメソッドを公開し、それ以外はすべて非公開にすることをお勧めします。

時間の経過と共に、いくつかのクラスをパッケージプライベートにするときと、サブクラスで使用するために保護された特定のメソッドを宣言するときの感覚を開発します。


ここにはテーブルのより良いバージョンがあります。 (モジュール用の列を持つ将来の証明)

説明

  • プライベートメンバーは、宣言されているのと同じクラス内でのみアクセスできます。

  • アクセス修飾子持たないメンバは、同じパッケージ内のクラス内でのみアクセスできます。

  • 保護されたメンバーは、同じパッケージ内の他のパッケージ内のサブクラス内のすべてのクラス内でアクセスできます。

  • パブリックメンバーは、(宣言されているパッケージをエクスポートしないmoduleに存在しない限り)すべてのクラスからアクセスできます。

選択する修飾語はどれですか?

アクセス修飾子は、誤ってカプセル化を破棄するのを防ぐツールです(*) 。 メンバーがクラス、パッケージ、クラス階層の内部にあるものであるか内部的でないものであり、それに応じてアクセスレベルを選択するかどうかを自分に問い合せてください。

例:

  • フィールドlong internalCounterはおそらくそれが変更可能で実装の詳細なのでプライベートであるべきです。
  • ファクトリクラス(同じパッケージ内)でのみインスタンス化する必要があるクラスは、パッケージの外側から直接呼び出すことはできないため、パッケージに制限されたコンストラクタが必要です。
  • レンダリングの直前に呼び出され、サブクラスのフックとして使用される内部void beforeRender()メソッドは保護する必要があります。
  • GUIコードから呼び出されるvoid saveGame(File dst)メソッドはpublicでなければなりません。

(*) カプセル封入とは何ですか?


注:これは受け入れられた回答の補足にすぎません。

これはJava Access Modifiersに関連しています。

Java Access Modifiersから:

Javaアクセス修飾子は、特定のクラス、そのフィールド、コンストラクタ、およびメソッドにアクセスできるクラスを指定します。アクセス修飾子は、クラス、そのコンストラクタ、フィールドおよびメソッドに対して個別に指定することができます。Javaのアクセス修飾子は、Javaのアクセス指定子として日常会話で参照されることもありますが、正しい名前はJavaアクセス修飾子です。クラス、フィールド、コンストラクタ、およびメソッドは、4種類のJavaアクセス修飾子のいずれかを持つことができます。

  • リストアイテム
  • プライベート
  • デフォルト(パッケージ)
  • 保護された
  • パブリック

クラスのメンバーへのアクセスを制御するからチュートリアル:

アクセス・レベル修飾子は、他のクラスが特定のフィールドを使用できるか、特定のメソッドを呼び出すことができるかどうかを決定します。アクセス制御には2つのレベルがあります。

  • トップレベルpublicまたはpackage-private(明示的修飾子なし)。
  • メンバレベル - public、private、protected、またはpackage-private(明示的修飾子なし)。

クラスは、修飾子publicで宣言することができます。この場合、そのクラスはすべてのクラスすべてで可視です。クラスに修飾子がない場合(デフォルトはpackage-privateとも呼ばれます)、それはそれ自身のパッケージ内でしか見ることができません

次の表は、各修飾子で許可されているメンバーへのアクセスを示しています。

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

最初のデータ列は、クラス自体がアクセスレベルで定義されたメンバーにアクセスできるかどうかを示します。ご覧のように、クラスは常に自分のメンバーにアクセスできます。2番目の列は、クラスと同じパッケージ内のクラス(親クラスに関係なく)がメンバーにアクセスできるかどうかを示します。3番目の列は、このパッケージの外部で宣言されたクラスのサブクラスがメンバーにアクセスできるかどうかを示します。4番目の列は、すべてのクラスがメンバーにアクセスできるかどうかを示します。

アクセスレベルは2つの方法であなたに影響します。まず、Javaプラットフォームのクラスなどの別のソースから来たクラスを使用する場合、アクセスレベルによって、自分のクラスが使用できるクラスのメンバーが決まります。第2に、クラスを書くときには、各メンバ変数とクラス内のすべてのメソッドにどのアクセスレベルが必要かを決定する必要があります。


  • 公開 - アプリケーションのどこからでもアクセスできます。

  • デフォルト - パッケージからアクセス可能。

  • 保護された - 他のパッケージのパッケージおよびサブクラスからアクセス可能。 同様に

  • プライベート - そのクラスからのみアクセスできます。


公式のチュートリアルはあなたの役に立つかもしれません。

            │ Class │ Package │ Subclass │ Subclass │ World
            │       │         │(same pkg)│(diff pkg)│ 
────────────┼───────┼─────────┼──────────┼──────────┼────────
public      │   +   │    +    │    +     │     +    │   +     
────────────┼───────┼─────────┼──────────┼──────────┼────────
protected   │   +   │    +    │    +     │     +    │         
────────────┼───────┼─────────┼──────────┼──────────┼────────
no modifier │   +   │    +    │    +     │          │    
────────────┼───────┼─────────┼──────────┼──────────┼────────
private     │   +   │         │          │          │    

+ : accessible
blank : not accessible

経験則として、

  • プライベート :クラススコープ。
  • デフォルト (またはpackage-private ):パッケージスコープ。
  • protected :パッケージスコープ+子 (パッケージと同じですが、別のパッケージからサブクラス化することもできます)。 protected修飾子は常に「親子関係」を保持します。
  • 公開 :どこでも。

その結果、アクセス権を3つの権利:

  • (D)irect (同じクラス内のメソッドから呼び出す)。
  • (R)eference (クラスへの参照、または "ドット"構文を使用してメソッドを呼び出す)。
  • (I)継承 (サブクラス化を介して)

次に、この単純なテーブルがあります。

+—-———————————————+————————————+———————————+
|                 |    Same    | Different |
|                 |   Package  | Packages  |
+—————————————————+————————————+———————————+
| private         |   D        |           |
+—————————————————+————————————+———————————+
| package-private |            |           |
| (no modifier)   |   D R I    |           |
+—————————————————+————————————+———————————+
| protected       |   D R I    |       I   |
+—————————————————+————————————+———————————+
| public          |   D R I    |    R  I   |
+—————————————————+————————————+———————————+

アクセス修飾子を考えているときは、このように考えてください(変数メソッドの両方に適用されます)。

public- どこからでもアクセス可能 - >
private宣言されている同じクラス内でのみアクセス可能

今、混乱はdefaultprotected

default - >アクセス修飾子キーワードがありません。これは、クラスのパッケージ内で厳密に利用可能であることを意味します。そのパッケージの外にどこにでもアクセスできます。

protected- > default同じパッケージクラスよりも少し厳密ではなく、離れているが、それは宣言されているパッケージの外のサブクラスによってアクセスできる。


プライベート

  • メソッド、変数、およびコンストラクタ

privateと宣言されたメソッド、変数、およびコンストラクタは、宣言されたクラス自体でのみアクセスできます。

  • クラスとインタフェース

プライベートアクセス修飾子は、最も限定的なアクセスレベルです。 クラスとインタフェースをプライベートにすることはできません。

注意

クラスにパブリック・ゲッター・メソッドが存在する場合、privateと宣言された変数はクラスの外部からアクセスできます。 スーパークラスで保護されていると宣言された変数、メソッド、およびコンストラクタは、他のパッケージのサブクラスまたは保護されたメンバのクラス内の任意のクラスによってのみアクセスできます。

保護された

  • クラスとインタフェース

保護されたアクセス修飾子は、クラスおよびインタフェースに適用できません。

メソッド、フィールドはprotectedとして宣言できますが、インターフェースのメソッドとフィールドはprotectedとして宣言できません。

注意

保護されたアクセスは、サブクラスにヘルパーメソッドまたは変数を使用する機会を与え、関連しないクラスがそれを使用しないようにします。

パブリック

publicと宣言されたクラス、メソッド、コンストラクタ、インタフェースなどは他のクラスからアクセスできます。

したがって、パブリッククラス内で宣言されたフィールド、メソッド、ブロックは、Java Universeに属するどのクラスからでもアクセスできます。

  • 異なるパッケージ

しかし、アクセスしようとしているパブリッククラスが別のパッケージにある場合は、パブリッククラスをインポートする必要があります。

クラスの継承のため、クラスのすべてのパブリックメソッドと変数は、そのサブクラスによって継承されます。

デフォルト - キーワードなし:

デフォルトのアクセス修飾子は、クラス、フィールド、メソッドなどのアクセス修飾子を明示的に宣言しないことを意味します。

  • 同じパッケージ内

アクセス制御修飾子なしで宣言された変数またはメソッドは、同じパッケージ内の他のクラスで使用できます。 インタフェースのフィールドは暗黙的にpublic static finalであり、インタフェースのメソッドはデフォルトでpublicです。

注意

静的フィールドをオーバーライドすることはできません。オーバーライドしようとするとエラーは表示されませんが、それ以外の場合は機能しません。

関連アンサー

参照リンク

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm


                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |       ✔       |     ✔     |       ✔       |   ✔   
————————————————+———————————————+———————————+———————————————+———————
protected       |       ✔       |     ✔     |       ✔       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |       ✔       |     ✔     |       ✘       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
private         |       ✔       |     ✘     |       ✘       |   ✘    

Javaのアクセス修飾子。

Javaアクセス修飾子は、Javaでアクセス制御を提供するために使用されます。

1.デフォルト値:

同じパッケージ内のクラスのみにアクセスできます。

例えば、

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

このアクセスは、公開および保護よりも制限されていますが、プライベートよりは制限がありません。

公衆

どこからでもアクセスできます。 (グローバルアクセス)

例えば、

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

出力:Hello

3.プライベート

同じクラス内でのみアクセスできます。

あるクラスのプライベートメンバーに別のクラスのプライベートメンバーにアクセスしようとすると、コンパイルエラーが発生します。 例えば、

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4.保護された

同じパッケージ内のクラスとサブクラスのみにアクセス可能

例えば、

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

出力:Hello


アクセス修飾子は、いくつかのレベルでアクセスを制限するためのものです。

パブリック:基本的には、同じパッケージ内にあるかどうかにかかわらず、どのクラスからでもアクセスできるように簡単です。

アクセスするには、同じパッケージにいる場合は直接アクセスできますが、別のパッケージに入っている場合はクラスのオブジェクトを作成できます。

デフォルト:同じパッケージ内で、どのクラスのパッケージからでもアクセスできます。

アクセスするには、クラスのオブジェクトを作成することができます。 しかし、パッケージの外でこの変数にアクセスすることはできません。

Protected:同じパッケージ内の変数にアクセスすることも、他のパッケージ内のサブクラスにアクセスすることもできます。 基本的にはdefault + Inheritedの動作です。

基本クラスで定義された保護フィールドにアクセスするには、子クラスのオブジェクトを作成することができます。

非公開:同じクラスにアクセスできます。

非静的メソッドでは、 この参照のために(コンストラクターでも)直接アクセスできますが、静的メソッドにアクセスするには、そのクラスのオブジェクトを作成する必要があります。


その違いは、既に提供されているリンクで見つけることができますが、どちらが使用されるかは、通常、「最小知識の原則」になります。 必要な可視性を最小限に抑えます。


簡単なルール。 すべてのプライベートを宣言することから始めます。 そして、必要に応じて一般に向けて進め、設計はそれを保証する。

エクスプレッションの選択肢や抽象化の選択肢が公開されているかどうかを尋ねるメンバーは、自分自身に尋ねます。 最初のものは、観察可能な振舞いではなく、実際の表現にあまりにも多くの依存性を導入するため、避けたいものです。

原則として、私はサブクラス化によってメソッドの実装をオーバーライドしないようにしようとしています。 ロジックを台無しにするのは簡単すぎる。 オーバーライドする場合は、抽象メソッドを宣言します。

また、オーバーライド時に@Overrideアノテーションを使用して、リファクタリング時に物事が壊れないようにします。


プライベート :限定クラスへのアクセスが制限されています

デフォルト(修飾子なし) :クラスとパッケージへのアクセスが制限されています

プロテクト :クラス、パッケージ、サブクラス(パッケージの内部と外部の両方)へのアクセスが制限されています。

パブリック :クラス、パッケージ(すべて)、およびサブクラスにアクセス可能...要するに、どこでも。


Public Protectedデフォルトとプライベートはアクセス修飾子です。

カプセル化、クラスの内容の表示と非表示を目的としています。

  1. クラスはpublicまたはdefaultにすることができます
  2. クラスメンバはパブリック、プロテクト、デフォルト、またはプライベートにすることができます。

プライベートはクラス外ではアクセスできません。デフォルトはパッケージ内でのみアクセス可能です。パッケージ内で保護されているクラスと、それを継承するクラスです。すべての人が公開されています。

通常、メンバー変数はprivateに定義されますが、メンバーメソッドはpublicです。


私はこのページのほとんどの回答を含め、非常に一般的に間違っている詳細に対処したいだけです。「デフォルト」アクセス(アクセス修飾子がない場合)は、必ずしもpackage-privateと同じではありません。それは何があるかによって異なります。

  • 非メンバ型(つまり、別の型の中で宣言されていないクラス、列挙型、インタフェース、および注釈型)は、デフォルトではpackage-privateです。(JLS§6.6.1

  • クラスメンバとコンストラクタは、デフォルトではパッケージプライベートです。(JLS§6.6.1

  • Enumコンストラクタはデフォルトでプライベートです。(実際に列挙型のコンストラクタ非公開でなければならず、それらを公開または保護しようとするのは誤りです)。Enum定数はpublicであり、アクセス指定子は許可されません。enumの他のメンバーはデフォルトでpackage-privateです。(JLS§8.9

  • インタフェースおよび注釈タイプのすべてのメンバーは、デフォルトでパブリックです。(実際には、インターフェースとアノテーションのタイプのメンバーは公開されていなければならず、非公開または保護されるようにするのは誤りです。)(JLS§9.3〜9.5


パッケージに表示されます。 デフォルト。 修飾子は必要ありません。

クラスにのみ表示されます( プライベート )。

世界に公開公開 )。

パッケージとすべてのサブクラス( 保護されている )に表示されます。

変数とメソッドは、呼び出される修飾子なしで宣言することができます。 デフォルトの例:

String name = "john";

public int age(){
    return age;
}

プライベートアクセス修飾子 - プライベート:

プライベート宣言されたメソッド、変数、およびコンストラクタは、宣言されたクラス自体でのみアクセスできます。 プライベートアクセス修飾子は、最も限定的なアクセスレベルです。 クラスとインタフェースをプライベートにすることはできません。

クラスにパブリック・ゲッター・メソッドが存在する場合、privateと宣言された変数はクラスの外部からアクセスできます。

プライベートモディファイアの使用は、オブジェクトがカプセル化して外の世界からのデータを隠す主な方法です。

例:

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

公開アクセス修飾子 - public:

publicと宣言されたクラス、メソッド、コンストラクタ、インタフェースなどは、他のクラスからアクセスできます。 したがって、パブリッククラス内で宣言されたフィールド、メソッド、ブロックには、Javaユニバースに属する任意のクラスからアクセスできます。

ただし、アクセスしようとしているパブリッククラスが別のパッケージにある場合は、パブリッククラスをインポートする必要があります。

クラスの継承のため、クラスのすべてのパブリックメソッドと変数は、そのサブクラスによって継承されます。

例:

public void cal(){

}

保護アクセス修飾子保護:

スーパークラスで保護されていると宣言された変数、メソッド、およびコンストラクタは、別のパッケージのサブクラスまたは保護されたメンバのクラスのパッケージ内のすべてのクラスによってのみアクセスできます。

保護されたアクセス修飾子は、クラスおよびインタフェースに適用できません。メソッド、フィールドはprotectedとして宣言できますが、インターフェースのメソッドとフィールドはprotectedとして宣言できません。

保護されたアクセスは、サブクラスにヘルパーメソッドまたは変数を使用する機会を与え、関連しないクラスがそれを使用しないようにします。

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}

実際には単純なグリッドショーより少し複雑です。 グリッドは、アクセスが許可されているかどうかを示しますが、アクセスを正確に構成するものは何ですか? また、アクセスレベルはネストされたクラスや継承と複雑なやり方で対話します。

「デフォルト」アクセス(キーワードがないことによって指定される)は、 package-privateとも呼ばれpackage-private 。 例外:インタフェースでは、修飾語はパブリックアクセスを意味しません。 public以外の修飾子は禁止されています。 Enum定数は常に公開されます。

概要

このアクセス指定子を持つメンバーへのアクセスは許可されていますか?

  • メンバーはprivateです:メンバーが呼び出しコードと同じクラス内で定義されている場合のみです。
  • メンバはパッケージプライベートです:呼び出しコードがメンバのすぐ近くのパッケージ内にある場合のみ。
  • メンバーはprotectedます:同じパッケージ、またはメンバが呼び出しコードを含むクラスのスーパークラスで定義されている場合
  • メンバーはpublicます:はい。

アクセス指定子に適用されるもの

ローカル変数と仮パラメータはアクセス指定子を取ることができません。 スコープ規則に従って本質的に外部にアクセスすることはできないため、効果的には非公開です。

トップスコープのクラスでは、 publicとpackage-privateのみが許可されます。 この設計選択はおそらく、 protected privateはパッケージレベルで冗長である(パッケージの継承はない)ためです。

すべてのアクセス指定子は、クラスメンバ(コンストラクタ、メソッド、静的メンバ関数、ネストされたクラス)で使用できます。

関連性: Javaクラスのアクセシビリティ

注文

アクセス指定子は厳密に順序付けることができます

public> protected> package-private> private

これは、 publicアクセスを最も多く提供し、 private最小限に抑えることを意味します。 プライベートメンバーで可能な参照は、パッケージプライベートメンバーに対しても有効です。 パッケージプライベートメンバーへの参照は、保護されたメンバーに対して有効です。 (保護されたメンバーへのアクセスを同じパッケージ内の他のクラスに与えることは間違いとみなされていました)。

ノート

  • クラスのメソッド 、同じクラスの他のオブジェクトのプライベートメンバーにアクセスすることができます。 より正確に言えば、クラスCのメソッドは、Cの任意のサブクラスのオブジェクト上のCのプライベートメンバーにアクセスできます。Javaは、インスタンスごとのアクセスをクラスごとに制限することをサポートしていません。 (これはprivate[this]を使用してサポートしているScalaと比較します)。
  • オブジェクトを構築するには、コンストラクタにアクセスする必要があります。 したがって、すべてのコンストラクタがプライベートである場合、クラスはクラス内のコード(通常は静的ファクトリメソッドまたは静的変数初期化子)によってのみ構築できます。 パッケージプライベートまたは保護されたコンストラクタでも同様です。
    • プライベートコンストラクタのみを持つことは、クラスが暗黙的または明示的にスーパークラスコンストラクタを呼び出すためにサブクラスのコンストラクタを必要とするため、クラスを外部的にサブクラス化できないことを意味します。 (ただし、サブクラスを持つネストされたクラスを含むことができます)。

内部クラス

また、内部クラスなどの入れ子スコープも考慮する必要があります。 複雑さの例としては、内部クラスにメンバーがあり、それ自体がアクセス修飾子をとることができます。 したがって、パブリックメンバーを持つプライベートな内部クラスを持つことができます。 メンバーにアクセスできますか? (下記を参照してください)。一般的なルールは、スコープを見て、各レベルにアクセスできるかどうかを再帰的に考えることです。

ただし、これは非常に複雑で、詳細はJava言語仕様を参照してください 。 (はい、過去にコンパイラのバグがありました。)

これらがどのように相互作用するかについては、この例を参照してください。 プライベート内部クラスを「リーク」することは可能です。 これは通常警告です。

class Test {
    public static void main(final String ... args) {
        System.out.println(Example.leakPrivateClass()); // OK
        Example.leakPrivateClass().secretMethod(); // error
    }
}

class Example {
    private static class NestedClass {
        public void secretMethod() {
            System.out.println("Hello");
        }
    }
    public static NestedClass leakPrivateClass() {
        return new NestedClass();
    }
}

コンパイラ出力:

Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface
        Example.leakPrivateClass().secretMethod(); // error
                                  ^
1 error

関連するいくつかの質問:





access-modifiers