- ベストアンサー
「囲うインスタンス」エラーとは? Javaでのインスタンス初期化エラーについて
- Javaの勉強中に「囲うインスタンス」エラーが発生しました。MainFrameクラス内でNodeクラスのインスタンスを初期化する際にエラーが発生し、どのように修正すれば良いかわかりません。
- エラーメッセージ「anime.java:648: MainFrame.PaintGraph.Node を含む囲うインスタンスが必要です。 dn1[i] = new PaintGraph.Node();」が表示されます。
- 解決策やその他のサンプルコードなど、ご存知の方に教えていただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず、インスタンスメンバを扱うにはインスタンスが必要ということはわかりますよね? class MyClass { static void method1() { } void method2() { } public static void main(String[] args) { MyClass.method1(); // OK MyClass.method2(); // NG MyClass m = new MyClass(); m.method2(); // OK } } クラスも同じです。static でない内側クラスを扱うには外側クラスのインスタンスが必要です。 class Outer { static class Inner1 { } class Inner2 { } public static void main(String[] args) { new Outer.Inner1(); // OK new Outer.Inner2(); // NG Outer o = new Outer(); o.new Inner2(); // OK } } 要するに、内側クラスが static であるかないかというのは、メソッドが static であるかないかというのと同じく、大きな違いがあるのです。 今回の件ではまず内側クラスを static にするのかしないのかという点を再検討した方がいいと思われます。
その他の回答 (1)
- UKY
- ベストアンサー率50% (604/1207)
クラスの中にクラスを入れる場合、内側のクラスが static であるかないかの違いが重要になってきますが、この点についてはどの程度理解していますか? 内側のクラスが static でない場合、内側クラスは外側クラスのインスタンスメンバになります。従って、内側クラスを扱うには外側クラスのインスタンスが必要ということになります。
お礼
ご回答ありがとうございます。 外側クラスのインスタンスとして、 PaintGraph panel1 = new PaintGrapn(); を作成し、 PaintGraph内の Node dn[]; に対して、 PaintGraph.Node dn1[] = panel1.dn; とし、 その要素を初期化しようとしたのですが、 これのどこがまずいのでしょうか。 >クラスの中にクラスを入れる場合、内側のクラスが static であるかないかの違い これについては、よくわかっていません。 classを作成せずに既存のプログラムを変更したりしていたものですから。。
お礼
再度のご回答、ありがとうございます。 つまり、 PaintGraph panel1 = new PaintGrapn(); に対して、 dn1[i] = new PaintGraph.Node(); ではなく、 dn1[i] = panel1.new Node(); と書けばよかったということですね。 (この書き方を知らず、 初めnew panel1.Node();と書いていました) 今回は、staticにすると都合が悪そうなので、 autoでの書き方がわかり、勉強になりました。 ありがとうございました。