さまざまなアクセス修飾子を持つクラスのすべての特性を確認するために、さまざまなアクセス修飾子を持つクラスのパッケージでプロジェクトを作成しようとしています。パブリック クラスとデフォルト クラスを含むパッケージを作成してから、保護クラスとプライベート クラス用に 2 つのパッケージを作成しようとしましたが、「クラス privatez の修飾子が不正です。パブリック、アブストラクト、およびファイナルのみが許可されています」と表示されました。どうしてこうなった。そして第二に、各クラスのテストはそれを理解するための良い方法です. 以前の投稿よりも良い質問をしようとしています。また、各アクセス修飾子の適用についても学びたいと思っています。
2 に答える
パブリック クラスとデフォルト クラスを含むパッケージを作成してから、保護クラスとプライベート クラス用に他の 2 つを作成しようとしましたが、「クラス privatez の修飾子が不正です。パブリック、アブストラクト、およびファイナルのみが許可されています」と表示されました。どうしてこうなった。
簡単な答えは、JLS はトップレベル クラスを として宣言できないと言っているということですprivate
。
その理由は、自分だけにしか見えないクラスを持つのは意味がないからです。他のクラスがそれを使用できる方法はありません (仮説的には、リフレクションで汚いトリックを使用することを除いて)。したがって、JLS は、「意味がありません。許可しません」と言っているだけです。
(ネストされたクラスはアクセスできるprivate
ようになりました...しかし、それは、最も外側のクラスを囲むすべてのクラスへのprivate
手段のためです...)private
そして第二に、各クラスのテストはそれを理解するための良い方法です。
テキスト・チュートリアルを読んで理解しようとした方が良いと思います。問題は、独自の例を書いて学習しようとすると、それらから間違った結論を簡単に引き出してしまうことです。
この例では:
package privatez; protected class privatez { }
仮想protected
クラスは、そのサブクラスにのみ表示される/表示される可能性があります。しかし、クラスは常にそのサブクラスから見えるので、これは意味がありません。(さらに、サブクラスを防ぐ方法は class を宣言することfinal
であり、「package private」を使用してサブクラス化を制限できます。つまり、アクセス修飾子はありません。)
protected
アクセス修飾子は、クラス内のものに対してのみ意味があります。トップレベルのクラスでは、 の通常の意味は意味がありprotected
ません。
(これは、例から学ぼうとする際の問題の 1 つです。コンパイラが例を拒否する理由を理解するのに苦労することになります。コンパイラが何かが間違っている理由を「説明」することを期待しないでください。それはコンパイラの役割ではありません。)
学びたいのなら、Javaに関する本を読んでください。ここで私はあなたに小さな要点を与えることができます:
クラスアクセス修飾子:
公衆
クラスは、その一部であるパッケージの外部からアクセスできます。
デフォルト
これは、何も指定しない場合です。クラスはパッケージ内のwithからアクセスでき、の一部です。
明確にするために:
private
修飾子は意味がありません。誰もプライベートクラスにアクセスできないため、拡張やインスタンスの作成もできません。
クラスの概念がある場合protected
、そのクラスは同じパッケージ内のサブクラスに表示されます。これは、修飾子を定義しない場合に当てはまります。
その他のクラス属性(これらはアクセス修飾子ではありません):
概要
定義されている場合、クラスのユーザーはそのインスタンスを作成できません。そして、それを拡張するクラスは、抽象メソッドを実装するか、それ自体を抽象として定義する必要があります。
最後の
定義されている場合、ユーザーはこのクラスを拡張できません。