29

私はJavaを学ぼうとしていましたが、アクセス指定子を調べたときに疑問がありました. 何も指定されていない場合のデフォルトのものとJavaの保護されたアクセス指定子の違いは何ですか?

4

6 に答える 6

47

この Javaチュートリアルは、役に立つかもしれません。

Modifier    | Class | Package | Subclass | World

public      |  Y    |    Y    |    Y     |   Y

protected   |  Y    |    Y    |    Y     |   N

no modifier |  Y    |    Y    |    N     |   N

private     |  Y    |    N    |    N     |   N
于 2012-05-02T09:32:16.560 に答える
38

このprotected指定子により、問題のクラスのすべてのサブクラスから、それらが存在するパッケージに関係なく、同じパッケージ内の他のコードへのアクセスが可能になります。デフォルトの指定子は、同じパッケージ内の他のコードによるアクセスを許可しますが、異なるパッケージに存在するサブクラス内のコードによるアクセスは許可しません。Java 言語仕様セクション 6.6を参照してください。

編集: Michael Schmeißer の要求により (他の人がこれを見つけるためにコメントを読んだり、リンクをたどったりする必要はありません): インターフェイスのすべてのメンバーは暗黙的にパブリックです。実際には、インターフェイス メンバに対してアクセス指定子以外を指定すると、コンパイル時エラーになりますpublic(ただし、デフォルトでパブリック アクセスを指定するアクセス指定子はありません)。JLS のクラス メンバーに関する完全なルール セットを次に示します (パッケージ、トップレベルのクラスとインターフェイス、および配列のルールについては、上記のリンクを参照してください)。

参照 (クラス、インターフェイス、または配列) 型のメンバー (クラス、インターフェイス、フィールド、またはメソッド) またはクラス型のコンストラクターは、型がアクセス可能であり、メンバーまたはコンストラクターがアクセスを許可するように宣言されている場合にのみアクセスできます。

  • メンバーまたはコンストラクターが public と宣言されている場合、アクセスが許可されます。

  • インターフェイスのすべてのメンバーは暗黙的にパブリックです。

  • それ以外の場合、メンバーまたはコンストラクターが保護されていると宣言されている場合、次のいずれかが true の場合にのみアクセスが許可されます。

  • メンバーまたはコンストラクターへのアクセスは、保護されたメンバーまたはコンストラクターが宣言されているクラスを含むパッケージ内から発生します。

  • §6.6.2で説明されているように、アクセスは正しいです。(この節は、派生クラスがスーパークラスの保護されたメンバーにアクセスできるようにする規則を参照します。§6.6.2 は次のように始まります。そのオブジェクトの実装を担当します。"それについて詳しく説明します。)

  • それ以外の場合、メンバーまたはコンストラクターがプライベートと宣言されている場合、メンバーまたはコンストラクターの宣言を囲む最上位クラス ( §7.6 )の本体内で発生した場合にのみ、アクセスが許可されます。

  • それ以外の場合は、型が宣言されているパッケージ内からアクセスが発生した場合にのみ許可されるデフォルト アクセスがあると言います。

于 2012-03-26T07:09:55.287 に答える