ネストした型-内部クラス(インナークラス)(3)-内部クラス,外部クラスへのアクセス
内部クラスからその内部クラスを包含する外部クラス(アウタークラス)のメンバーへのアクセス,逆に外部クラスから内部クラスのメンバーへのアクセスについてみていく事にする。
外部クラスから内部クラスへのアクセス
外部クラスの外から内部クラスにアクセスするには、「外部クラス名.内部クラス名」を使ってアクセスするが、 内部クラスを包含する外部クラス内から、内部クラスにアクセスするには「内部クラス名」のみでアクセスできる。
リスト1(OuterClass3.java)
内部クラスと外部クラス間のメンバーへのアクセス
親子間に隠し事など存在しない。
内部クラスとその内部クラスを包含する外部クラス間では、たとえpaivate宣言されていも、お互いのクラスのメンバーどうしを自由にアクセスできる。
以下にその例を示す。
リスト2(OuterClass6.java)
面白いのは、内部クラスからその外部クラスの静的メンバにアクセスするにはクラス名の指定は必要ない(18行目,19行目)が、 外部クラスから内部クラスの静的メンバにアクセスするにはクラス名を指定する必要がある(35行目,36行目)事だ。
内部クラスからその外側の外部クラスのインスタンスメンバーにアクセス
インスタンスメンバーとして宣言された内部クラスから外部クラスのインスタンスメンバーにアクセスする場合には、 変数名だけでアクセスできる。リスト3(OuterClass7.java)
しかし、内部クラスのメンバーにその外側の外部クラスのインスタンスメンバーと同じ変数名のメンバーが存在する場合には、内部クラスのメンバーにより外部クラスのメンバーが隠されてしまう。
この場合、外部クラスのメンバーにアクセスするには「外部クラス名.this.外部クラスのメンバー」を使って、明示的に外部クラスのメンバーである事を指定する事でアクセス可能である。
リスト4(OuterClass8.java)
インスタンスメンバーとして宣言された内部クラスから、その外側の外部クラスのインスタンスメンバーにアクセスできるが、 staticなメソッドからはインスタンスメンバーにアクセスできないのと同様に、当然、staticな内部クラスからは、外部クラスのインスタンスメンバーにはアクセスできない。
メソッド内で定義されているインナークラス(ローカルクラス)からのメソッド内の変数へのアクセス
通常、メソッド内で定義されているインナークラスから、その外側のメソッド内のローカル変数へアクセスする事はできない。
しかし、メソッド内の変数にfinalを指定すると、メソッド内で定義されているインナークラスからメソッド内の変数へアクセスする事ができるようになる。
以下に、メソッド内の変数にfinalを指定して、メソッド内で定義された内部クラスからその変数にアクセスする例を示す。
リスト5(LocalClass2.java)
クラスのインスタンスは、ローカルクラスであっても、それが他の変数に参照されている間はメモリーに残っていて、メソッドの外に出ても呼び出される可能性がある。
それに対してメソッド内の変数は、ローカル変数としてスタックに格納され、メソッドの外に出ると、別のメソッドのローカル変数により再利用され,上書きされて消えてしまう。
このため、ローカルクラスからメソッド内の変数にアクセスできてしまうと、消えてしまった変数にアクセスできてしまう事になるため、これはできない。
メソッド内の変数にfinalを指定すると、変数の値が固定となりスタックエリア外のメモリー領域に格納されるため、変数が消えてしまう事が無いためアクセスが許されると推察される。