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

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

「囲うインスタンス」のエラーの意味がわからない

javaを勉強しています。 MainFrameクラス内にPaintGraphクラスがあり、 PaintGraphクラス内でNodeクラスを作りました。 このNodeクラスのインスタンスを、MainFrame内(PaintGraphの外)で初期化したいのですが、エラーになります。 おそらく基本的なことだと思うのですが、 エラーの意味がわからず、どう修正して良いのかわかりません。 ご存知の方、ご教示いただけますようお願い致します。 anime.java:648: MainFrame.PaintGraph.Node を含む囲うインスタンスが必要です。 dn1[i] = new PaintGraph.Node();

  • Java
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
  • 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

  • クラス、インスタンスメソッドについて

    JAVA初心者です。 現在、先人が作ったプログラムの修正作業を行っておりますが、 以下の点に疑問があります。(因みに、先人はJAVAのスペシャリストではありません。) あるクラスが以下の様になっております。 public class Sample { private static Sample s = new Sample(); private Sample() { } /** クラスメンバに存在するインスタンス取得 * @return Sampleクラスの唯一のインスタンス */ public static Sample getInstance(){ return s; } public static void methodA(){ ... } } でこのmethodAを使用するには、以下の様にします。 Sample.getInstance().methodA() これはこれで納得で、うまく動作しますが、これは 結局の所、クラスメソッドにしたかったという事ではないのかな?と 疑問に感じています。つまり、単純に Sample.methodA と呼び出せばうまくいきます。 ところが、たまたまAPIドキュメントを見ていた所、Calendarクラスにもやはり getInstanceというものが存在し、現在日時を取得するのに Calendar.getInstance().getTime() の様に呼び出すと書いてありました。 Sampleクラス、JAVAのCalendarクラス(これに限った事では無いとは思いますが) のこれらのgetInstanceの効用とはなんなんでしょうか? ・クラスの外でnewでインスタンスを作り出さない所 ・それでいてクラスメソッドではない(?)所 この辺りについてご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • インスタンスの作成=初期化という意味?

    javaを勉強しているのですが、インスタンスの作成とはそのクラスにアクセスして利用できるよう準備をする。つまり、フロッピーディスクのフォーマットみたいなもの?(いわゆる初期化) ということでいいのでしょうか? もし違っていたら小学生でもわかるように教えてください。

  • Ruby インスタンスの初期化について

    newメソッドを使わずにinitializeメソッドを定義しただけで インスタンスが作成されて初期化までされる理屈について 教えていただけないでしょうか? またクラスを作るときに基となっているObjectクラスとは一体 何物なのか、教えて頂きたい。 例 01:#Sampleクラスを作る 02:class Sample 03: #Samlpeクラスのインスタンスを初期化 04: def imitialize( lv, hp ) 05: end 06:end ↑の場合インスタンスlvとhpは、「lv = sample.new( 0 )」などと言う ように定義されてない。 それにnewメソッドでインスタンスを作りそこに数値の0を代入できるなら そもそもinitializeで初期化する必要は無いのではないでしょうか? 有識者の方いらっしゃいましたら、ご説明をよろしくお願いします。

    • ベストアンサー
    • Ruby
  • インスタンスについて

    個人的にJavaの勉強を始めた者です。 サンプルのソースをいただいたのですが、質問があります。 package xxxx.xxxxx.xxxxx; import yyyy.yyyy.yyyy; public final class ABC { /** 自クラスのインスタンス private static final ABC  _SELF  = new ABNC(); 中略 } 1.このように、自クラスのインスタンスを作成するのは何故でしょうか? 2.>_SELFのように "_"を先頭につけるのは、理由がるのでしょうか? サンプルを提供してくれた方には月曜まで連絡がとれません。 Javaのエキスパートの皆さん、よろしくお願いします。

    • ベストアンサー
    • Java
  • シンボルを見つけられませんというエラーでコンパイルできない

    こんにちは。 Test.javaとTest2.javaというファイルを作りコンパイルしようとしたんですがタイトルのエラーが出てコンパイルできません。全く意味が分からなくて困ってます。 test.javaの中で Test2 test2 = new Test2(); という形でTest2クラスのインスタンスを生成しています。 同じフォルダの中にあるのに見当たらないというのはどうにも分かりません。 環境変数は CLASSPATH . PATH C:\Program File\Java\jdk1.5.0_06\bin となってます。

    • ベストアンサー
    • Java
  • 子インスタンスを登録するメソッドの作成

    Java初心者です。 学習中に躓いてしまったので、ご教示いただければと思います。 Testという1つのクラスを作成し、 そこから複数のインスタンスを作成します。 Test test1 = new Test(); Test test2 = new Test(); Test test3 = new Test(); 元のTestクラスの中に、 public void addSub(Test child) という、引数に指定したインスタンスを子に登録するメソッドを用意します。 実際に使うときは、 test1.addSub(test2); とすれば、test1の子にtest2が登録されるようにしたいのです。 基本的にサブクラスにするには、クラスを作る段階でextendsを用いるイメージなので、同じクラスの別インスタンスを親子関係にする、というのがよく分かりません。 このプログラムの目的は、最終的に一番親となったインスタンス(test1)の合計メソッドを呼び出して、自分の子供に登録されているインスタンス(test2,test3)全ての値を合算するということです。 質問の方法が曖昧で分かりにくいと思いますが、 指示いただければ追記いたしますので、 お時間のある方お力を貸していただければと思います。 宜しくお願いします。

    • ベストアンサー
    • Java
  • サーブレットインスタンスを割り当て中のエラー

    Ecripse + Tomcat で、インターフェースの実装をさせましたら、下記のエラーが出てしまいました。 インターフェースの実装を外したのですが、同じエラーのままで、わからなくな ったので、プロジェクトを最初から作り直しましたが、同じエラーが消えなくなってしまい ました。 原因や調べ方をご教授ください。 -------------------------------------------------- HTTP Status 500 - type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception javax.servlet.ServletException: サーブレットインスタンスを割り当て中のエラーです at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:625) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:163) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433) (省略) root cause java.lang.UnsupportedClassVersionError: control/LoginServlet (Unsupported major.minor version 49.0) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:539) (省略) --------------------------------------------------

    • ベストアンサー
    • Java
  • 【VB.NET】 J#ライブラリのエラー

    Framework4.5.2の環境で、J#ライブラリ(vjslib.dll)のjava.io.FileOutputStreamクラスのインスタンスを作成するとエラーになります。 Framework2.0ではエラーは発生しませんでした。 エラーになる箇所 ↓ Dim clsStream As New java.io.FileOutputStream(FilePath) エラー内容 'java.lang.System' のタイプ初期化子が例外をスローしました。 場所 java.lang.System.getSecurityManager() どうすれば解決できますか?教えてください。お願い致します。

  • 同一クラスインスタンス名で別クラスのインスタンス作成方法(C++)

    下記ソース(Java)の処理をするような、C++の実装方法を教えていただきたいです。 【処理内容】 クラスBのインスタンスを保持しており、クラスBのインスタンス名と同一であるクラスAのインスタンス生成 ClassA A_Instance = (ClassA)Class.forName(B_instance.name).newInstance(); 要はクラスインスタンスの名前の求め方がわからないのです。それさえわかれば、newしてクラスポインタを返すメソッドを用意すれば何とかなると考えていますが。 ※C++のAPI一覧はどこにあるのだろうか・・・

  • Runnableのインスタンス化について

    下記のコードについてです。 Runnableがインスタンス化されていますが、 どうしてそれが可能なのかが分かりません。 分からない点は 1.Runnableはインタフェースであるから、本来、直接インスタンス化は不可能であるはず。 2.しかし、Runnableはクラスライブラリjava.langパッケージに含まれている。 だからインスタンス化は可能なのかもしれない。 3.あるいは、下記のコードではメソッド内の無名クラスであるから、「new Runnable(){」の 部分でスーパークラスとしてのRunnableを継承したサブクラスを生成しているのかもしれない。 アドバイスをよろしくお願い致します。 public class Main{ public static void main(String[]args){ Runnable task = new Runnable(){ public void run(){ System.out.println("run"); } }; Thread thread = new Thread(task){ public synchronized void start(){ System.out.println("start"); } }; thread.start(); } }

    • ベストアンサー
    • Java

専門家に質問してみよう