web-dev-qa-db-ja.com

1つのファイル内の複数のクラス:修飾子privateはここでは許可されていません

このコードがコンパイルされない理由を理解できません:

class A {
    public static void main(String[] args) {
        System.out.println("hi");
    }
}

private class B {
    int a;
}

内容をA.Javaという名前のファイルに保存しています-エラーが発生します:

modifier private not allowed here // where I have defined class B

これは、Bをプライベートおよび保護として試したときに発生します。誰かがこの背後にある理由を私に説明できますか?

ありがとう!

16
Jaguar

Java言語仕様 から:

保護されたアクセス修飾子とプライベートは、直接囲まれたクラス宣言内のメンバークラスにのみ関係します

そうです、privateおよびprotected修飾子はトップレベルのクラス宣言には許可されていません。

トップレベルクラスは公開されている場合とされていない場合がありますが、privateprotectedは許可されていません。クラスがパブリックとして宣言されている場合は、任意のパッケージから参照できます。それ以外の場合は、同じパッケージ(名前空間)からのみ参照できます。

プライベートトップレベルクラスは、どのクラスからも参照できなかったため、あまり意味がありません。定義上、使用できません。 privateは、メンバークラスがクラスをそれを囲むクラスのみを参照できるようにすることで問題ありません。

保護されたメンバークラスは、(1)同じパッケージの任意のクラスおよび(2)それを囲むクラスの任意のサブクラスから参照できます。この概念をトップレベルのクラスにマッピングすることは困難です。最初のケースは、アクセス修飾子のないトップレベルクラスでカバーされています。 2番目のケースは、最上位クラスには適用されません。これは、このクラス(サブクラスなど)と特別な関係を持つ別のパッケージからの囲みクラスまたはその他のものがないためです。このため、protectedは許可されていません。これは、その基礎となる概念がトップレベルのクラスに適用できないためです。

22
Andreas_D

次のように、BをAのネストにします。

class A {
    public static void main(String[] args) {
        System.out.println("hi");
    }

    private class B {
        int a;
    }
}

または、Bを別のファイルに移動します。また、デフォルトのアクセスレベルを維持することもできます。これにより、パッケージ内からのみクラスにアクセスできます。

class A {
    public static void main(String[] args) {
        System.out.println("hi");
    } 
}

class B {
    int a;
}
3

privateおよびprotectedは、トップレベル(メンバーではない)クラス/インターフェイスに許可されることは無意味です。

これらは、変数、定数、コンストラクター、メソッド、クラス、およびインターフェースであるクラスメンバーにのみ適用できます。

なぜ:

(1)private:クラスをprivateとして定義した場合、その意味/目的は何でしょうか。その範囲は、一部の領域に限定する必要があります。デフォルトのアクセスはすでにパッケージプライベートです。そして、誰もクラスをソースファイルプライベートにすることを望んでいません(理由を推測して)Javaアプリケーションは最終的にパッケージの形で編成されますが、ではないため、許可するのは良いプログラミング手法ではないかもしれませんソースファイルの用語。ソースファイルはパッケージの一部である必要があるため、大まかな/最終的なビューでは、各クラス/インターフェイスは、.Javaファイルだけでなく、パッケージの一部です。したがって、適用されません。

(2)protected:何かが保護されている場合、それはパッケージ内でのみ、他のパッケージのサブクラスでのみ使用可能である必要があります。別のパッケージのクラスを拡張するには、他のパッケージのすべてのクラスで使用できる必要がありますが、protectedは、クラスは拡張されたクラスでのみ使用できるようにする必要があると述べています。これは一種のデッドロック状態です。したがって、該当しません。

出典:私の読みと理解

1
Venkataswamy

プライベート/保護された修飾子はまったくありません。

0
djna

Bは何かにプライベートである必要があります。クラスAの定義内に配置するか、別のファイルB.Javaを作成してそこで定義しますが、プライベートにすることはできません。

0
linuxuser27