2009-05-04 13 views

答えて

22

いいえ、-IS:

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

プライベート クラスメンバまたはコンストラクタ は、 トップレベルクラス(§7.6)の本文内でアクセス可能であり、 のメンバー宣言または コンストラクタを囲んでいます。 サブクラスによって継承されません。

しかし、関係なく、この言語制限の、あなたはaccess private fields through reflectionことができます。

Field privateStringField = 
    MyClass.class.getDeclaredField("privateString"); 
privateStringField.setAccessible(true); 

String fieldValue = (String) privateStringField.get(privateObject); 
System.out.println("fieldValue = " + fieldValue); 
+0

useはインスタンス変数で保護することができます –

19

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

+3

実際には、クラスの将来のバージョンからプライベート変数を削除する場合は、保護されたセッターを使用する必要があります。 – jmucchiello

1

子クラスは(プライベートアクセス制御の全体のポイントです)プライベートメンバーにアクセスすることはできません使用する必要があります。これらはサブクラスが自分の親から継承し、したがって、見変数であるため、http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

基本的にあなたがfooで宣言されるパブリックまたは保護された変数をしたい:ここにウェブサイト上で見つけるのテーブルがあり、このような質問については、

1

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

アクセサーが必要です。また、継承を世話してください、varは本当に親にあるべきですか?覚えておいてくださいjava language specification, 3rd editionによらないチェック...

1

あなたは下位クラスでプライベート変数にアクセスすることはできません。通常は、このために "protected"または "package"(デフォルト)レベルのアクセスを使用したいと考えています。しかし、あなたが本当にトリッキーになりたい場合は、反射とAccessibleObjectを使うことに頼ることができます。 あなたが本当にバインドしていない限り、プロダクションコードのためにこれを行うことはお勧めできません。テストなどのために、それはいいです。

1

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

0

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

関連する問題