funini.com kei Java static main

static main

static mainの呪い

Javaでちょっとプログラム書いたことある人なら、
static でない 変数 this を static コンテキストから参照することはできません。
みたいな謎なエラーに突き当たることでしょう。 この原因ですが、大抵はJavaのmainメソッドがstaticであるために起こります。
まず深く考えない解決法(逃げ方)ですが、下のような"Static逃れ"をしたらいいです。
public class MyJava{
  public static void main(String Args[]){
    MyJava mj = new MyJava();
    mj.main();
  }

public void main() { /* ここに書きたかった内容を書く*/ } }

これで大抵は何とかなるんですが、もうちょっと真面目に原因を考えてみます。
例えば下のようなプログラムを考えてみます。

public class MyJava{
  String str;
  class Nest {
    Nest(){/*コンストラクタ*/}
  }
  public static void main(String Args[]){
    str = "hoge";
    Nest n = new Nest();
  }
}

まず、mainの中の

str = "hoge";

ですが、strはインスタンス変数(インスタンスごとに異なる変数)なので、 static なメソッドからアクセスすることはできません。ここまでは分かると思います。
さらに、

Nest n = new Nest();

ですが、こっちもエラーになります。理由ですが、クラス内クラスは、「入れ子の親」の クラスのインスタンス変数にアクセスできるので、もしここで入れ子クラスNestの インスタンスを作れることにすると、Nestが内部でstrをいじってしまう恐れがあるからです。 だから、以下のように内部クラスをやめたら、変なstatic逃れはいらなくなります。

class Nest {
  Nest(){/*コンストラクタ*/}
}
public class MyJava{
  public static void main(String Args[]){
    String str;
    str = "hoge";
    Nest n = new Nest();
  }
}

C++ではmain()は特別な関数になっていますが、Javaはmainもあくまで「クラス内のメソッド」とすることで 一貫性を保つ一方、こういう面倒な問題も生じるわけです。