プライベートインスタンス変数foo
を持つクラスbar
があるとします。
次に、別のクラスbaz
を用意しましょう。これはextends foo
です。 baz
で定義されたアクセサメソッドがない場合、foo
の非静的メソッドはbar
の変数foo
にアクセスできますか?
ちなみに私はJavaで働いています。
いいえ、 Java言語仕様、第3版 に準拠していません:
6.6.8例:プライベートフィールド、メソッド、およびコンストラクター
プライベートクラスメンバーまたはコンストラクターは、メンバーまたはコンストラクターの宣言を囲む最上位クラス(7.6)の本体内でのみアクセスできます。サブクラスには継承されません。
ただし、この言語制限に関係なく、canreflection を介してプライベートフィールドにアクセスします。
Field privateStringField =
MyClass.class.getDeclaredField("privateString");
privateStringField.setAccessible(true);
String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);
いいえ、そのためにはprotected.
このような質問の場合、Webサイトの表はどこですか http://Java.Sun.com/docs/books/tutorial/Java/javaOO/accesscontrol.html
これらはサブクラスが親から継承する変数であるため、基本的にはfooで宣言するpublicまたはprotected変数が必要です。
サブクラスでスーパークラスのプライベート変数を使用するには、アクセサーメソッドが必要です。それ以外の場合は、プライベートの代わりに保護された修飾子を使用します。
子クラスはプライベートメンバーにアクセスできません(プライベートアクセス制御の要点です)。
... fooで定義されたアクセサメソッドがない場合
アクセサーが必要です。その上、継承に注意してください。その変数は本当に親にあるべきですか? IS-Aチェックを覚えておいてください。
子孫クラスのプライベート変数にはアクセスできません。通常、これには「保護された」または「パッケージ」(デフォルト)レベルのアクセスを使用します。ただし、本当にトリッキーになりたい場合は、リフレクションと AccessibleObject を使用して取得できます。実際に束縛されているのでない限り、量産コードでそれを行うことはお勧めしません。テストなどには問題ありません。
クラスのプライベート変数は、常にそのクラス内にスコープを持っています。サブクラス間で共有する必要がある場合は、「保護されている」と宣言する必要があります