子クラスから親のプライベートインスタンス変数にアクセスしますか?
-
03-07-2019 - |
質問
プライベートインスタンス変数 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修飾子を使用します。
クラスのプライベート変数は、常にそのクラス内にスコープを持っています。サブクラス間で共有する必要がある場合は、「保護」と宣言する必要があります