web-dev-qa-db-ja.com

子クラスから親のプライベートインスタンス変数にアクセスしますか?

プライベートインスタンス変数fooを持つクラスbarがあるとします。

次に、別のクラスbazを用意しましょう。これはextends fooです。 bazで定義されたアクセサメソッドがない場合、fooの非静的メソッドはbarの変数fooにアクセスできますか?

ちなみに私はJavaで働いています。

23
lfaraone

いいえ、 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);
27
Wim Coenen

いいえ、そのためにはprotected.

21
RichieHindle

このような質問の場合、Webサイトの表はどこですか http://Java.Sun.com/docs/books/tutorial/Java/javaOO/accesscontrol.html

これらはサブクラスが親から継承する変数であるため、基本的にはfooで宣言するpublicまたはprotected変数が必要です。

6
Sandro

サブクラスでスーパークラスのプライベート変数を使用するには、アクセサーメソッドが必要です。それ以外の場合は、プライベートの代わりに保護された修飾子を使用します。

1

子クラスはプライベートメンバーにアクセスできません(プライベートアクセス制御の要点です)。

1
alphazero

... fooで定義されたアクセサメソッドがない場合

アクセサーが必要です。その上、継承に注意してください。その変数は本当に親にあるべきですか? IS-Aチェックを覚えておいてください。

1
ivmos

子孫クラスのプライベート変数にはアクセスできません。通常、これには「保護された」または「パッケージ」(デフォルト)レベルのアクセスを使用します。ただし、本当にトリッキーになりたい場合は、リフレクションと AccessibleObject を使用して取得できます。実際に束縛されているのでない限り、量産コードでそれを行うことはお勧めしません。テストなどには問題ありません。

1
George Armhold

クラスのプライベート変数は、常にそのクラス内にスコープを持っています。サブクラス間で共有する必要がある場合は、「保護されている」と宣言する必要があります

0
neeranzan