- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Java 他クラスの呼び出しが上手くいきません。)
Java初心者がクラスの呼び出しでエラーに困っています
このQ&Aのポイント
- Java初心者がTest01とTest02という2つのクラスを作成し、画面遷移のプログラムを作成しています。しかし、Test01クラス内でTest02クラスを呼び出す箇所でエラーが発生しています。
- 作成したプログラムでは、Test01クラスとTest02クラスがIApplicationクラスを継承しており、画面遷移を行うためのボタンを配置しています。しかし、Test01クラスからTest02クラスをインスタンス化する箇所で「シンボルを見つけられません。」というエラーが表示されています。
- どこが間違っているのかわからず、解決策を教えていただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「シンボルを見つけられません。」でコンパイルできないのは、 Test01クラスからTest02クラスを見つけられないことが原因かと思われます。 No.1様は == Test01とTest02は同じパッケージですか? 違うのであればTest01にimport xxxx.Test02;を記述する必要がある == とおっしゃってるように思います。 原因がご理解できないようでしたら まずはJavaの勉強をしたほうがよろしいかと思います。
その他の回答 (1)
- tavatar
- ベストアンサー率37% (3/8)
回答No.1
パッケージ名は揃っておりますでしょうか? 揃っていない場合は、importを追加するか、揃えなければいけません。
質問者
補足
ご回答ありがとうございます。 「パッケージ名が揃っているか?」というご指摘なのですが、 importの指定はサイトの作成例を見てそのまま記述しました。 パネルにボタンとラベルを組み込み、コンポーネントリスナーの機能を実装するだけなのですが、 mport com.nttdocomo.ui.*; と記述するだけでは、まだ他に足りないものがあるのでしょうか。 作成した二つのクラスファイルの内、Test02.javaの方は、上記のimport指定でもエラーが出ていませんし、 問題のあるクラスファイル(Test01.java)についても、構成はTest02.javaと同じなので、importの指定に問題があるとは思われないのですが。
お礼
planet_9_9様 ご回答ありがとうございました。 ご指摘のように「パッケージ」の意味がよく分かっていませんでした。 ソースファイルに対してパッケージを作成していませんので、Test01.java 、Test02.java、共に「デフォルトパッケージ」に属する状態にありました。 ともかく、 Test02.javaをパネルクラスのファイルに改め、二つ存在していたソースファイルをTest01.java一つに統一するようにプログラムを書き換えた後で、ファイルTest02.javaを、Test01.javaのsrcホルダーに一緒にしたところ、つまり二つのファイルを同一のパッケージに含めたところ、コンパイルに成功しました。 以下が書き換えたプログラムです。 ===== Test01.java ===== import com.nttdocomo.ui.*; class p1 extends Panel implements ComponentListener{ Test01 parent; Label lbl1=new Label("p1に居ます。"); Button btn1=new Button("next"); p1(Test01 pparent){ parent = pparent; setTitle("p1"); add(lbl1); add(btn1); setComponentListener(this); Display.setCurrent(this); } public void componentAction(Component source, int type, int param) { if(type == ComponentListener.BUTTON_PRESSED) { if(source==btn1){ Test02 test02=new Test02(); Display.setCurrent(test02); lbl1.setText("p2に遷移"); } } } } public class Test01 extends IApplication{ public void start() { p1 pp01=new p1(this); } } ===== Test02.java ===== import com.nttdocomo.ui.*; public class Test02 extends Panel implements ComponentListener{ Label lbl1=new Label("p2に居ます。"); Button btn1=new Button("next"); Test02(){ setTitle("p2"); add(lbl1); add(btn1); setComponentListener(this); Display.setCurrent(this); } public void componentAction(Component source, int type, int param) { if(type == ComponentListener.BUTTON_PRESSED) { if(source==btn1){ lbl1.setText("p1に遷移"); } } } } 別ファイルのクラスを利用したい場合、利用しようと思うクラスは全て同一のパッケージ属していなければならないという風に理解したのですが、私の理解は正しいでしょうか。 では、修正前のファイルTest02.javaが、 Public宣言されていたにもかかわらず、コンパイルエラーが出たのは何故なのでしょうか。 Publicで宣言するとは、パッケージの異同に関係なくアクセス可能であることを必ずしも意味しない、ということでしょうか。 また、ファイルTest01.javaの、Test02呼び出し部分を消去し、componentActionメソッド内の記述を、単にラベル表示のみに留めて、コンパイルしたところ、エラーこそ生じないものの、実行に際しては、ボタンクリックしてもラベル表示の切り替えができないという不可解な現象に見舞われました。 そこで、あるサイトのサンプルを参考に、ファイルTest01をパネルクラスの継承クラスを作成する仕方で書き換えたところ、今度はラベルの表示の切り替えに成功しました。 パネル型の変数を宣言して初期値をセットしてゆく最初のやり方では、リスナーが正常に機能せず、パネルクラスの継承クラスを作成する仕方ではこれが成功したのは何故なのか、疑問が残ります。 ですが、ともかく、別クラスファイルの呼び出しの問題点がパッケージ作成にあったことに気づいたときは、目から鱗の落ちるような思いでした。 意図している動作を実行するプログラムが作成できましたこと、感謝いたします。 ご指摘にもありましたように、上記の課題も含めて、これからjavaをもっとじっくり勉強したいと思います。