22

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

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をプライベートおよび保護として試した場合の両方で発生します。誰かがこの背後にある理由を教えてもらえますか?

ありがとう !

4

7 に答える 7

27

Java言語仕様から:

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

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

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

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

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

于 2010-08-16T06:55:34.790 に答える
4

次のように、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;
}
于 2010-08-16T06:52:32.680 に答える
1

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

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

なぜ:

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

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

出典:私の読みと理解

于 2014-02-01T12:44:48.343 に答える
0

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

于 2010-08-16T06:51:53.513 に答える
0

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

于 2010-08-16T06:52:09.107 に答える
-1

クラスにpublicキーワードを使用しない場合、デフォルトではプライベートになります(ファイル内でのみ表示されます)。

.javaファイルごとに存在できるパブリッククラスは1つだけであり、他のすべてはプライベートである必要があります。したがって、クラスAはパブリックにすることができ、クラスBは例の修飾子を必要としません。パブリッククラス名は.javaファイル名と一致する必要があります(たとえば、A.javaには「A」と呼ばれるパブリッククラスを1つだけ含めることができます)。

于 2010-08-16T06:53:59.363 に答える
-2

A.java2つのクラスを含めることはできません。

于 2010-08-16T06:57:32.033 に答える