[an error occurred while processing this directive]
[an error occurred while processing this directive]static でない 変数 this を static コンテキストから参照することはできません。みたいな謎なエラーに突き当たることでしょう。 この原因ですが、大抵はJavaのmainメソッドが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もあくまで「クラス内のメソッド」とすることで
一貫性を保つ一方、こういう面倒な問題も生じるわけです。