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もあくまで「クラス内のメソッド」とすることで
一貫性を保つ一方、こういう面倒な問題も生じるわけです。
[an error occurred while processing this directive]