2014年12月3日水曜日

staticメソッドからインスタンス変数にアクセスできないたった一つの理由

なぜ、staticメソッドからインスタンス変数、インスタンスメソッドにアクセスできないのかと思う人が多いと思います。

例えば、以下のようなコードはコンパイルエラーになります。



class Student {

  //インスタンス変数
  String name;

  //コンストラクタ
  Student(String name) {
 
    this.name = name;
 
  }

  //クラスメソッド
  static void showName() {
 
    //インスタンス変数を表示???
    System.out.print(name);
  }

}

class StudentTester {
  public static void main(String[] args) {

    Student st1 = new Student("山田太郎");
 
    //クラスメソッドを呼ぶ
    Student.showName();
  }
}


これはStudentクラスのstaticメソッド「showName()」がインスタンス変数の「name」を表示しようとしているからです。

なぜこれがダメなのかは少し考えれば分かります。

StudentTesterのメインメソッドが以下のように記述されていたとします。



Student st1 = new Student("山田太郎");

//山田太郎と表示
System.out.print(st1.name);


Student st2 = new Student("田中花子");

//田中花子と表示
System.out.print(st2.name);



この後で、クラスメソッド「showName()」を呼ぼうとすると以下の処理を実行することになります。


//クラスメソッド
static void showName() {

  //nameを表示したいけど誰の名前??
  System.out.print(name);
}


インスタンス変数はnewでインスタンスが生成されてから、その中身を入れることができます。

仮にStudentクラスから1つのインスタンスしか生成できないならば、nameはそのインスタンス変数の中身で良いでしょう。

上の例で言えば、山田太郎しかインスタンスを生成できないならnameといえば「山田太郎」となります。

しかし、1つのクラスからはインスタンスはいくつでも生成することができます。

上の例でも、「山田太郎」「田中花子」と2つ生成しています。

その後でインスタンス変数のnameと言われても、「山田太郎」「田中花子」のどちらを指しているのか分かりませんよね?

なので、staticメソッドからインスタンス変数にアクセスできないようにしているのです。

staticメソッドからインスタンスメソッドを呼べないのも同様です。

山田太郎くんの持っているメソッドなのか、田中花子さんの持っているメソッドなのか誰にも分からないからです。

このように考えれば理解できますよね?

0 件のコメント:

コメントを投稿