5
class Orange{

    Orange(){
    }

}

クラスの前とコンストラクターの前での修飾子 (この場合は package-private) の使用の違いは何ですか? コンストラクターの前の修飾子は、クラスのインスタンスをインスタンス化できることを意味すると思いますOrange。しかし、クラスの前の修飾子はどうでしょうか?

4

8 に答える 8

15

まず、3 つのアクセス修飾子によって作成される 4 つのアクセス レベルがあります。

  1. public - どこからでもアクセス可能
  2. protected - 同じパッケージと子でアクセス可能
  3. デフォルト - 同じパッケージ内でのみアクセス可能
  4. private - 同じクラスでのみアクセスできます。

あなたは正しいです-コンストラクターのレベルの修飾子は、クラスのインスタンス化に直接関係しています。

クラスのレベルの修飾子は、クラスのアクセシビリティを決定します。

于 2013-05-24T04:10:30.607 に答える
5

まず、不安を和らげるために、あなたが提供したコード完全に有効な 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) にのみ関係します。

アクセス修飾子protectedprivate(§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) が付いているものはすべてオプションと見なされます。

それで、これは何に削減されますか?

  • JLS は、クラスが [class] 修飾子を必要としないことを義務付けています。
  • JLS は、[class] 修飾子が存在する場合、次の規則のいずれかに従うことを義務付けています。
    • 修飾子が の場合、public最上位クラスとメンバー クラスにのみ適用されます。
    • 修飾子がprotectedまたはの場合private、直接囲んでいるクラスまたは列挙内のメンバー クラスにのみ適用されます。
    • 修飾子が表示されるstatic場合がありますが、メンバー クラスにのみ適用されます。

コンストラクターにも同様のルール セットがあります。

ConstructorDeclaration:
    ConstructorModifiers(opt) ConstructorDeclarator
                                Throws(opt) ConstructorBody

ConstructorDeclarator:
    TypeParameters(opt) SimpleTypeName ( FormalParameterList(opt) )

繰り返しますが、これは次のように分類されます。

  • JLS は、コンストラクターが [constructor] 修飾子を必要としないことを義務付けています。
  • JLS では、コンストラクタ修飾子に 、 、 、 、または を含めるabstractことstaticfinalできnativeませstrictfpsynchronized
  • JLSは、通常のクラスのコンストラクターにアクセス修飾子が指定されていない場合、コンストラクターにはデフォルトのアクセス権があることを義務付けています(§8.8.3、強調鉱山)。
于 2013-05-24T05:44:31.243 に答える
3

Java ではパブリック クラスまたはデフォルト クラス (最上位クラスの場合のみ) のみを宣言でき、これらの修飾子によってクラスのアクセシビリティが決定されます。

また、「クラスまたはインターフェイスがプライベートまたは保護されたアクセス修飾子を受け取ることができないのはなぜですか?」も参照することをお勧めします。

コンストラクターに関しては、明示的にアクセス修飾子が定義されていない場合、コンストラクターは default 型のアクセス制御を持ちます。したがって、このコンストラクターにはパッケージ レベルのアクセスがあります。そのパッケージ内で、このデフォルト コンストラクターを持つクラスのクラスとして定義されているクラスだけが、それにアクセスできます。「 Java コンストラクターはデフォルトで公開されていませんか?」を参照してください。

コンストラクターが非公開の場合、そのクラス内のコードのみがこれにアクセスできます。修飾子をよりよく理解するには、「 Access Modifiers In Java」を参照する必要があります。

于 2013-05-24T04:03:51.440 に答える
1

クラスの修飾子は、誰がクラスにアクセスできるかを定義します。たとえば、クラスは任意のパッケージのクラスからアクセスできます。修飾子が記述されていない場合、クラスは同じパッケージのpublicクラスからのみアクセスできます。

コンストラクタ、メソッド、フィールドの修飾子は同じ意味です。しかしprivateprotectedもっと意味があります。Private は、現在のクラスからのみアクセスできます。同じパッケージのクラスだけでなく、そのサブクラスからも保護されます。

コンストラクタに関するご質問について。クラスは複数のコンストラクタを持つことができます。それらのいくつかは非公開にすることができ、他のいくつかは公開することができます。クラスがパッケージで保護されている場合、コンストラクターを公開する意味がないことは正しいです。とにかく、パッケージの外部の誰もこのクラスを呼び出すことはできません。

これは、抽象クラスの public コンストラクターを作成するのとまったく同じです。抽象クラスはそれ自体でインスタンス化できないため、そのコンストラクターはprotectedorである必要がありますprivateが、コンパイラーはこれを気にしません。

ところで、デフォルトのパッケージを使用することは一般的に使用されておらず、推奨される手法でもありません。

于 2013-05-24T04:03:01.780 に答える
1

レベル修飾子の使用種類:class

http://javapapers.com/core-java/access-modifiers-in-Java-explain/

レベル修飾子の使用種類:constructor

http://www.careercup.com/question?id=296844#commentThread302715

于 2013-05-24T04:20:03.040 に答える
0

クラス修飾子は、メソッド修飾子と同様に機能します。パブリック、プライベート、ファイナル、アブストラクトなどの作品。

Public を使用すると、任意のパッケージのクラスからクラスとそのメソッドにアクセスできます。

修飾子は、定義されたパッケージからのクラスへのアクセスのみを許可しません。

プライベートはすべてのアクセスを防ぎます (最上位クラスで使用する場合、これは意味がありません)。

抽象クラスを使用すると、親(抽象) クラスから派生したクラスを作成できます。たとえば、Abstract Shape クラスを作成し、Rectangle クラスで形状を拡張して、そのすべてのメソッドと変数を継承し、抽象メソッドの定義を強制することができます。

于 2013-05-24T04:05:32.683 に答える