インナークラスから外部クラスを参照する場合の
外部クラス名.this
の記法があるらしく、ちょっと調べてみました。
まず、思いついた
public class Main {
public static void main(String []args) {
TestThis t = new TestThis();
t.this.hp = 10;///
}
public class TestThis {
int hp;
int mp;
String name;
}
}
こういうことか?と思いましたが
t.this.hp = 10;
この部分がエクリプスで、tを型に解決できないとのこと。
t classを作成しますか?と出ました。
t.hp = 10;ならok何ですけどね。
どうやら、インナークラスの解釈が間違っていたらしく、
class out~{
class in~{
}
}
のイメージ。
これをもとにエクリプスで再度実験。
public class Main {
public static void main(String []args) {
Outer o = new Outer();
Outer.Inner oi = o.new Inner();
oi.innerPrint();
}
public class Outer{
int outerhp = 10;
public class Inner{
public void innerPrint() {
System.out.println(Outer.this.outerhp);
}
}
}
}
これでもエラー
エクリプスさんによると
アクセス可能な型 Main のエンクロージング・インスタンスがありません。型 Main のエンクロージング・インスタンスで割り振りを限定する必要があります (たとえば x.new A() で、x は Main のインスタンス)。
とのこと調べてみると、ちょっとわかりませんでした。
public class Main {
public static void main(String []args) {
Outer o = new Outer();
Outer.Inner oi = o.new Inner();
oi.innerPrint();
}
public static class Outer{
int outerhp = 10;
public class Inner{
public void innerPrint() {
System.out.println(Outer.this.outerhp);
}
}
}
}
結果からいくとこれでエラーなく動くのですが。
(Outer classをstatic にしました)
なにやらバグに近いなにかのようなので、明日はそれを調べたいと思います。
http://d.hatena.ne.jp/chiheisen/20110502/1304272928
インデントの位置をみると、自分のコードとはまた違ったことを言っている気がします。
main(String[]args)がOuterの中にある、、、
こんなコードは書いたことがありません。
Outer.Inner oi = o.new Inner();
このnewの仕方は、前に本で見た気がする。もう一度、表紙に木の切り株が書いてある、あの本を読めばわかるかな。
インデント修正するたびにずれてく笑エクリプスから貼り付けたのだとなんか書式違うのかな。