• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:「囲うインスタンス」のエラーの意味がわからない)

「囲うインスタンス」エラーとは? Javaでのインスタンス初期化エラーについて

このQ&Aのポイント
  • Javaの勉強中に「囲うインスタンス」エラーが発生しました。MainFrameクラス内でNodeクラスのインスタンスを初期化する際にエラーが発生し、どのように修正すれば良いかわかりません。
  • エラーメッセージ「anime.java:648: MainFrame.PaintGraph.Node を含む囲うインスタンスが必要です。 dn1[i] = new PaintGraph.Node();」が表示されます。
  • 解決策やその他のサンプルコードなど、ご存知の方に教えていただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.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 にするのかしないのかという点を再検討した方がいいと思われます。

sunasearch
質問者

お礼

再度のご回答、ありがとうございます。 つまり、 PaintGraph panel1 = new PaintGrapn(); に対して、 dn1[i] = new PaintGraph.Node(); ではなく、 dn1[i] = panel1.new Node(); と書けばよかったということですね。 (この書き方を知らず、 初めnew panel1.Node();と書いていました) 今回は、staticにすると都合が悪そうなので、 autoでの書き方がわかり、勉強になりました。 ありがとうございました。

その他の回答 (1)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

クラスの中にクラスを入れる場合、内側のクラスが static であるかないかの違いが重要になってきますが、この点についてはどの程度理解していますか? 内側のクラスが static でない場合、内側クラスは外側クラスのインスタンスメンバになります。従って、内側クラスを扱うには外側クラスのインスタンスが必要ということになります。

sunasearch
質問者

お礼

ご回答ありがとうございます。 外側クラスのインスタンスとして、 PaintGraph panel1 = new PaintGrapn(); を作成し、 PaintGraph内の Node dn[]; に対して、 PaintGraph.Node dn1[] = panel1.dn; とし、 その要素を初期化しようとしたのですが、 これのどこがまずいのでしょうか。 >クラスの中にクラスを入れる場合、内側のクラスが static であるかないかの違い これについては、よくわかっていません。 classを作成せずに既存のプログラムを変更したりしていたものですから。。

関連するQ&A