変数へのアクセス

メンバークラスはもちろん自身のクラスの変数にはアクセスが可能です。
しかし内部クラスであるメンバークラスから外部クラスの変数へのアクセス条件が
決まっています。

変数へのアクセス条件

 

外部クラスのインスタンスメンバー

外部クラスのstaticメンバー
インスタンスメンバークラス
staticメンバークラス
X

つまり、インスタンスメンバークラスの場合は外部クラスがインスタンスメンバーでもstaticメンバークラスでもアクセスは可能ですが、
staticメンバークラスの場合はstaticメンバーにはアクセス可能ですが、インスタンスメンバーにはアクセスできません。

サンプルプログラム(Sample79.java)

class Sample79{
  String str = "ようこそ";
  static String str1 = "Javaの世界へ";

  class Inner79{
     void InnerMethod79(){
    System.out.println(str);
    System.out.println(str1);
   }

}
  void method(){
     Inner79 in= new Inner79();
     in.InnerMethod79();

 }

    public static void main(String args[]){

    Sample79 obj = new Sample79();
   obj.method();
    }

}

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル実行します。

サンプルプログラム(Sample79_1.java)

class Sample79_1{
  String str = "ようこそ";
  static String str1 = "Javaの世界へ";
 static class Inner79_1{

     void InnerMethod79_1(){

    System.out.println(str);
    System.out.println(str1);
   }

}
    public static void main(String args[]){
    Inner79_1 in = new Sample79_1.Inner79_1();
     in.InnerMethod79_1();
    }

}

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

初期費用無料・月額840円から 高セキュリティ・高安定のレンタルサーバー
■超オススメのWADAXレンタルサーバー
選べるプランとOS!さくらのVPS


コンパイル・実行します。

上記2つのサンプルプログラムを比較してみてください。
Sample79.javaはコンパイルでき実行もできましたが、Sample79_1.javaのほうはコンパイルエラーが出ます。

つまり、staticメンバークラスの場合は外部クラスのオブジェクトを生成する必要がありませんでした。

しかし、外部クラスのインスタンス変数は必ずオブジェクトを生成し、インスタンス化してやる必要がありました。

したがって外部クラスのオブジェクトを必要としないstaticメンバークラスからは呼び出せないことになります。

つまり以下のようにしてやれば実行できるようになるのです。

サンプルプログラム(Sample79_2.java)

class Sample79_2{
  String str = "ようこそ";

  static String str1 = "Javaの世界へ";

 static class Inner79_2{
     void InnerMethod79_2(){

   Sample79_2 obj = new Sample79_2();

    System.out.println(obj.str);
    System.out.println(str1);
   }

}

    public static void main(String args[]){
    Inner79_2 in = new Sample79_2.Inner79_2();
     in.InnerMethod79_2();

    }

}

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます。

これは、あえて内部クラス内で外部クラスのオブジェクトを生成して
外部クラスのインスタンス変数にアクセスした例ですが、たぶんこんな書き方はあまりされないと思います。

ページのトップへ戻る