2012-01-06 4 views
5

特定のメンバー変数が宣言されているアクティビティから継承する場合、継承を実行するサブクラスでこれらのメンバー変数にどのようにアクセスしますか?Javaで継承したクラス変数へのアクセス

+0

また、名前の競合がないことを確認してください。予期しない動作に陥っている場合は、http://java.sys-con.com/node/46344 – jefflunt

答えて

7

publicまたはprotectedメンバー名は、任意のコンストラクタまたはstaticメソッドまたはイニシャライザからthis.memberName経由でアクセスできます。

privateまたはパッケージレベルのメンバー(別のパッケージのサブクラスからアクセスされる)に直接アクセスすることはできず、public getterなどの特権のないインターフェースを介してアクセスする必要があります。

2

メンバーがprivateと宣言されている場合、またはデフォルト(パッケージ)アクセスで宣言されていて、サブクラスが別のクラスにある場合、変数にアクセスすることはできません。アクセサーが提供されていれば、それを使うことができます。それ以外の場合はアクセスできません。

(あいまいはありません場合this.var、または単にvar)のメンバーは、彼らは自分自身のクラスで宣言されたかのようにあなたがそれらにアクセス、protectedまたはpublicを宣言した場合。スーパークラスと同じ名前のサブクラスにメンバーがある場合は、super.varを使用してスーパークラス変数にアクセスできます。

+0

ダウンボッターの説明に注意してください。 –

+1

説明できないダウン投票に対抗するため+1。 – mre

4
class A { 
    protected int a = 3; 
} 

class B extends A { 
    protected int b = 2; 

    void doIt() { 
     System.out.println("super.a:" + super.a); 
     System.out.println("this.b: " + this.b); 
    } 
} 
+0

'super'キーワードは必要ありません。 – mre

+1

そうです。しかし、これは初心者の質問です。だから、私はそれを絶対に明確にしたい。 – ollins

+2

フィールドがサブクラスのフィールドによって隠されている場合にのみ、 'super'キーワードが必要です。 –

1

他によって述べたように、パブリックおよび保護フィールドは、サブクラスからthis.fieldを介してアクセスすることができます。パッケージプライベートフィールドにも同じ方法でアクセスできますが、サブクラスが親パッケージと同じパッケージに含まれている場合に限ります。

このようにプライベートフィールドにアクセスすることはできませんが、セキュリティ設定で許可されている場合は、Java reflectionを使用してアクセスできます。通常、プライベートメンバーは通常プライベートな理由からプライベートであることが推奨されていますが、コードテストの目的でプライベートクラスメンバーにアクセスするなど、状況によっては便利です。このように反射を使用する方法については、the answers to this questionを参照してください。

関連する問題