2013-07-10 23 views
12

内部クラスでは、外部クラスの変数にアクセスできますが、メソッドのローカル変数はアクセスできません。私はメソッドのローカル変数についてアクセス可能ではない部分を理解しましたが、なぜ外部クラス変数にアクセスできるのかを知りたいのですが?内部クラスの外部クラス変数へのアクセス

私の理解では、内部クラスは外部クラスとバインドするので、親が利用可能である限り、子はその親変数にアクセスできます。私は正しいですか?

+1

スタティック内部クラスまたは非スタティック? –

+2

@DuncanJones:内部クラスは常に非静的です。ここをクリックしてください。http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html –

+1

@VishalKありがとう、私は間違ってネストされたクラスを内部クラス*と呼んできました。うわー! –

答えて

28

外部クラスをOuterとし、内部クラス(非静的)のスコープから、Outer.this.fooをフィールドに取得するとします。例えば

、アウタークラスの名前であり、fooフィールドを識別する

Outer.this.foo=new ArrayList<>(); 

また、直接foo=new Baz()として取得することもできますが、シャドウイングによる名前の競合がある場合は、内部フィールドを選択します。

それは静的な内部クラスの場合は、明示的なインスタンスが必要:

outerInstance.foo=new ArrayList<>(); 

またはアクセスするためのフィールドが静的であれば、といつものようにそれにアクセス:

Outer.staticFoo=new ArrayList<>(); 
+0

こんにちは、返信いただきありがとうございます、ここで私の質問は、内部クラスと外部クラスが同時の問題の可能性があります一度に変数を使用する場合です。しかし、内部クラスはどのようにクラスuse.so、これを内部クラスで処理するには、シンクロナイズを使用する必要があります。 – kiran

+1

@ user5いいえ、他の場合に行う必要のある同期を超えてはなりません。内部クラスと外部クラスによって新しいスレッドが作成されることはありません。 – hexafraction

0

回答: Javaの外部クラス変数は、レキシカルスコープのためにアクセス可能です。

レキシカルスコープとは何ですか?

コードがオーサリングされた順に定義されたスコープです。クラス構造は次のようになります。

OuterMost 
    --Inner 
    --InnerMost 

次に、最も内側のクラスは、内側から外側の変数にアクセスできるようになります。

関連する問題