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

StackOverflow https://stackoverflow.com/questions/822648

質問

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

今、別のクラス baz を作成しましょう。 fooを拡張します foo にアクセサメソッドが定義されていない場合、 baz の非静的メソッドは foo の変数 bar にアクセスできます。 ?

ところで、私はJavaで働いています。

役に立ちましたか?

解決

いいえ、 java言語に従っていない仕様、第3版

  

6.6.8例:プライベートフィールド、メソッド、およびコンストラクタ

     

プライベート   クラスメンバまたはコンストラクタは   本体内でのみアクセス可能   囲む最上位クラス(§ 7.6)   メンバーの宣言または   コンストラクタ。継承されない   サブクラス。

ただし、この言語制限に関係なく、リフレクションを介してプライベートフィールドにアクセスする

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変数を宣言する必要があります。これらはサブクラスが親から継承する変数であり、bazで見られるためです。

子クラスは、プライベートメンバー(プライベートアクセス制御の全体のポイント)にアクセスできません。

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

アクセサが必要です。その上、継承の世話をします、その変数は本当に親にあるべきですか? IS-Aチェックを忘れないでください。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top