class Orange{
Orange(){
}
}
クラスの前とコンストラクターの前での修飾子 (この場合は package-private) の使用の違いは何ですか? コンストラクターの前の修飾子は、クラスのインスタンスをインスタンス化できることを意味すると思いますOrange
。しかし、クラスの前の修飾子はどうでしょうか?
まず、3 つのアクセス修飾子によって作成される 4 つのアクセス レベルがあります。
あなたは正しいです-コンストラクターのレベルの修飾子は、クラスのインスタンス化に直接関係しています。
クラスのレベルの修飾子は、クラスのアクセシビリティを決定します。
まず、不安を和らげるために、あなたが提供したコードは完全に有効な Java 構文です。
実際には、デフォルト パッケージ内の他のクラスによってのみインスタンス化/使用できるクラスを作成しました。package foo;
パッケージ内のクラスのみがこのクラスを見ることができるため、パッケージで定義した場合にも機能します (例: foo
)。
さて、質問の核心に。
フィールドとメンバーへのアクセスを制御するには、さまざまな方法があります。そして、彼らはそれぞれ異なることをします。
private
可視性は最も目立たない。定義クラスのみがフィールドにアクセスできます。
修飾子がないかpackage private
、2 番目に目立たない。パッケージ内の定義クラスとすべてのクラスはフィールドにアクセスできますが、サブクラスとその他の部分はアクセスできません。
protected
は 2 番目に多く表示されます。フィールドへのアクセスが禁止されているのは、他のクラスのみです。
public
が最も見られます。 すべてがフィールドにアクセスできます。
クラスのレベルのモディファイヤは興味深いものになります。これは、Java 言語仕様、§8.1.1からのものです。
アクセス修飾子
public
(§6.6) は、ローカル クラス (§14.3) または匿名クラス (§15.9.5) ではなく、トップ レベル クラス (§7.6) およびメンバー クラス (§8.5) にのみ関係します。アクセス修飾子
protected
とprivate
(§6.6) は、直接囲んでいるクラスまたは列挙宣言 (§8.5) 内のメンバー クラスにのみ関係します。修飾子 static はメンバー クラス (§8.5.1) にのみ関係し、トップ レベル、ローカル、または匿名クラスには関係しません。
クラス宣言で同じ修飾子が複数回出現すると、コンパイル時エラーになります。
2 つ以上の (異なる) クラス修飾子がクラス宣言に現れる場合、必須ではありませんが、上記の の生成と一致する順序で現れるのが慣例です
ClassModifier
。
一般に、クラス宣言は次のようになります。
ClassDeclaration:
NormalClassDeclaration
EnumDeclaration
NormalClassDeclaration:
ClassModifiers(opt) class Identifier TypeParameters(opt)
Super(opt) Interfaces(opt) ClassBody
(opt) が付いているものはすべてオプションと見なされます。
それで、これは何に削減されますか?
public
最上位クラスとメンバー クラスにのみ適用されます。protected
またはの場合private
、直接囲んでいるクラスまたは列挙内のメンバー クラスにのみ適用されます。static
場合がありますが、メンバー クラスにのみ適用されます。ConstructorDeclaration:
ConstructorModifiers(opt) ConstructorDeclarator
Throws(opt) ConstructorBody
ConstructorDeclarator:
TypeParameters(opt) SimpleTypeName ( FormalParameterList(opt) )
繰り返しますが、これは次のように分類されます。
abstract
ことstatic
はfinal
できnative
ませstrictfp
んsynchronized
。Java ではパブリック クラスまたはデフォルト クラス (最上位クラスの場合のみ) のみを宣言でき、これらの修飾子によってクラスのアクセシビリティが決定されます。
また、「クラスまたはインターフェイスがプライベートまたは保護されたアクセス修飾子を受け取ることができないのはなぜですか?」も参照することをお勧めします。
コンストラクターに関しては、明示的にアクセス修飾子が定義されていない場合、コンストラクターは default 型のアクセス制御を持ちます。したがって、このコンストラクターにはパッケージ レベルのアクセスがあります。そのパッケージ内で、このデフォルト コンストラクターを持つクラスのクラスとして定義されているクラスだけが、それにアクセスできます。「 Java コンストラクターはデフォルトで公開されていませんか?」を参照してください。
コンストラクターが非公開の場合、そのクラス内のコードのみがこれにアクセスできます。修飾子をよりよく理解するには、「 Access Modifiers In Java」を参照する必要があります。
クラスの修飾子は、誰がクラスにアクセスできるかを定義します。たとえば、クラスは任意のパッケージのクラスからアクセスできます。修飾子が記述されていない場合、クラスは同じパッケージのpublic
クラスからのみアクセスできます。
コンストラクタ、メソッド、フィールドの修飾子は同じ意味です。しかしprivate
、protected
もっと意味があります。Private は、現在のクラスからのみアクセスできます。同じパッケージのクラスだけでなく、そのサブクラスからも保護されます。
コンストラクタに関するご質問について。クラスは複数のコンストラクタを持つことができます。それらのいくつかは非公開にすることができ、他のいくつかは公開することができます。クラスがパッケージで保護されている場合、コンストラクターを公開する意味がないことは正しいです。とにかく、パッケージの外部の誰もこのクラスを呼び出すことはできません。
これは、抽象クラスの public コンストラクターを作成するのとまったく同じです。抽象クラスはそれ自体でインスタンス化できないため、そのコンストラクターはprotected
orである必要がありますprivate
が、コンパイラーはこれを気にしません。
ところで、デフォルトのパッケージを使用することは一般的に使用されておらず、推奨される手法でもありません。
レベル修飾子の使用と種類:class
http://javapapers.com/core-java/access-modifiers-in-Java-explain/
レベル修飾子の使用と種類:constructor
http://www.careercup.com/question?id=296844#commentThread302715
クラス修飾子は、メソッド修飾子と同様に機能します。パブリック、プライベート、ファイナル、アブストラクトなどの作品。
Public を使用すると、任意のパッケージのクラスからクラスとそのメソッドにアクセスできます。
修飾子は、定義されたパッケージからのクラスへのアクセスのみを許可しません。
プライベートはすべてのアクセスを防ぎます (最上位クラスで使用する場合、これは意味がありません)。
抽象クラスを使用すると、親(抽象) クラスから派生した子クラスを作成できます。たとえば、Abstract Shape クラスを作成し、Rectangle クラスで形状を拡張して、そのすべてのメソッドと変数を継承し、抽象メソッドの定義を強制することができます。