• ベストアンサー

クラスの参照(同じファイル内 vs 別々のファイルの場合)

二つの.javaファイルがあります。 <ABC.java> class ABC { public static void main(String args[]) { A obj = new A(); obj.hello(); } } --------------------------------------------- <A.java> class A{ void hello() { System.out.println("Hello from A"); } } --------------------------------------------- ABC.javaファイルでコンパイルすると、「 シンボルを解釈処理できません。」というエラーメッセージが出ます。でも、ABC.javaファイルの中に、class Aを続けて書くとコンパイルできます。なぜ、別々のファイルにすると参照できないのでしょうか? (おなじフォルダ内に入れています) 教えてください。よろしくお願いします。

  • Java
  • 回答数6
  • ありがとう数1

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

  • ベストアンサー
  • hameggs
  • ベストアンサー率38% (8/21)
回答No.4

おはようございます。 質問内容と、他の方の解答の補足の書き込みをみて 思ったのですが、ソースファイルとクラスファイル を勘違いしてませんでしょうか?もしかしたら、 必要以上に解答内容が大きくなってしまって混乱 してるのかな? 実際解答としては「No#1」の方の内容で十分です。 簡単に説明しますと… 2つのクラスを同一Javaファイルに書いてコンパイル すると、両方のクラスのクラスファイルが生成されます。 しかし2つのクラスを別々のファイルに書くと,当たり前 ですが、それぞれのクラスファイルしか生成されません。 質問内容のテストプログラムでは、Aクラスを記述している ファイルをコンパイルしないで、ABCファイルをコンパイル したのではないですか?それなら、Aクラスが存在していな いのですから、コンパイラもわからないので「シンボルを 解釈処理できない」というエラーを出してしまいます。 ちょっと長くなってしまいましたね^^;

その他の回答 (5)

  • Harry_
  • ベストアンサー率55% (36/65)
回答No.6

もうひとつ補足しておくと、 同じファイル内に複数のクラスを宣言した場合は、 それらのクラスが全て同時に javac に渡されるわけですから、 その場合はソースパスを問わずお互いのクラスを認識します。 ファイル内に複数クラスを並べて宣言しているような状況のこと を言っていると思いますので、これはインナークラスではありませんし、 インナークラスだから認識できる、のではありません。

  • Harry_
  • ベストアンサー率55% (36/65)
回答No.5

javac は、 ABC.java のコンパイル中にクラス A を参照する必要があり、 かつ CLASSPATH に A.class が見つからない場合、 自動的に A.java を探してきてコンパイルしようとします。 その際、javac はソースパス ( CLASSPATH ではない ) として 指定されているところから A.java を探そうとします。 特に指定しない場合、CLASSPATH がそのままソースパスとして扱われるので 両者を混同している人が多いですが、別物です。 この場合、A.java があるところにソースパスが通っていない (つまり CLASSPATH が通っていない)のが原因だと思います。 javac -sourcepath . ABC.java でどうですか。

  • Te-Sho
  • ベストアンサー率52% (247/472)
回答No.3

同じフォルダにあってもコンパイラはclasspathで指定されたフォルダにそのクラスを探しに行きます。その同じといわれるフォルダにclasspathが定義されていなければそのクラスは参照されません。 あと#2の方がおっしゃっているのはパッケージの話ですね。サンプルからするとJAVAの入門書をお読みのようですがJAVA VM内のクラスに対するスコープとして一つの配布形態としてまとめるためにパッケージという考えがあります。別パッケージのクラスを参照するためにimportと言う定義をしなければならないのです。 同一フォルダにあるclassファイルは同一パッケージとして見なされる。と言うことであり別パッケージを参照するためのimportという定義は覚えておいた方がいいですよというアドバイスだと思います。 今後、ファイルを入出力するためのjava.ioなどのパッケージ化されたクラスライブラリを扱う場合は必ずimportが必要となります。そのことをお忘れなく。

  • yuji
  • ベストアンサー率37% (64/169)
回答No.2

ANo.#1に加えて、ですが、他のクラスを参照する場合、 基本的に import XXXX; を書くくせをつけた方がいいでしょう。 同じパッケージ内なら省略しても自動的に import してくれますが、 わかりやすくするために書くことをお勧めします。

kohiro
質問者

補足

教えてくださりありがとうございます。 もう少し教えてください。 同じファイル内なら省略してもいいのですよね? classファイルは同じファイルにあります。 なのに、なぜ参照出来ないのでしょうか? 同じファイル=同じフォルダ内で間違いないですよね?教えてください、よろしくお願いいたします。

  • Te-Sho
  • ベストアンサー率52% (247/472)
回答No.1

続けて記入すればインナークラスですから参照できて当たり前です。classファイルもabc.classとabc$a.classという二つのクラスができているはずです。 別ファイルでコンパイルを通すのでしたらa.javaをコンパイルしてできたa.classをclasspathが通っているフォルダに置いてください。

関連するQ&A

  • メソッドのオーバーライド(java)

    class A3{ void hello(){ System.out.println("A3"); } void hello(int i){ System.out.println("A3"+i); } } class B3 extends A3{ void hello(){ System.out.println("B3"); } } class C3 extends B3{ void hello(String s){ System.out.println("C3"+s); } } class MethodOverriding3{ public static void main(String args[]){ A3 obj = new C3(); obj.hello(); } } 上のプログラムを実行すると"B3"と表示されまが、どうしてクラスBのメソッドが実行されるのでしょうか? クラスAのメソッドが無視される仕組みがわかりません。 また、クラスMethodOverriding3でobj.hello("abc")としてコンパイルすると mo.java:25: シンボルを見つけられません。 シンボル: メソッド hello(java.lang.String) 場所 : A3 の クラス obj.hello("abc");   ^ エラー 1 個 とエラーが出ます。 どうしてでしょうか? 誰か教えてください、お願いします。

    • ベストアンサー
    • Java
  • 超初心者です。教えてください。

    初心者です。javaのマニュアル書に書いてある class Hello{ public static void main (String[] args){ System.out.println("Hi! Hello!!"); } }   はコンパイルすることができたのですが、実行すると Exception in thread "main"java.lang.NoClassDefFoundError: Hello という文書が出てきますどうすればいいのでしょうか。教えてください。

    • ベストアンサー
    • Java
  • publicクラス

    クラスの修飾子にpublicをつける理由を教えて下さい。 さらに、なにも修飾子をつけなときは 同一パッケージ(ファイル)内からでしかアクセスできないはずですよね? Test.javaとBase.javaを以下のように定義します。 class Test { public static void main(String[] args) { Base b = new Base(); } } class Base { public void show() { System.out.println("hello!"); } } この2つのファイルは同じディレクトリにあります。 public修飾子をつけていないにも関わらず、なぜインスタンス化ができるのでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • javaが実行されない

    雑誌を買ってjavaでプログラミングをしているのですが なぜか実行できません。 ツールはteraPadとJDKを使っています。 public class sample { public static void main(String[] args) { System.out.println("hello!"); } } コンパイルし、classファイルを実行すると Exception in thread "main" java.lang.NoClassDefFoundError: sample/class と出て実行できません。結果はhello!となるはずなのですがどなたかどこがおかしいのか教えてください。

    • ベストアンサー
    • Java
  • java 実行できない

    javaで public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!"); } } のようなプログラムをかいて、コンパイルして、実行しようとすると エラー: メイン・メソッドがクラスStringで見つかりません。次のようにメイン・メソッドを定義してください。 public static void main(String[] args) またはJavaFXアプリケーション・クラスはjavafx.application.Applicationを拡張する必要がありま というエラーがでます。コンパイルはできます。jdkは1.8.0_25を使っています。

  • シンボルを解決できません・・・?

    Java初心者です。 public class mondai5 { public static void main(String args[]) { String str = "abc"; if( str != null && str.index0f('a') != -1) { System.out.println("OK"); } else { System.out.println("BAD"); } } } これをコンパイルをしようとすると、このような表示が出ます。 シンボルを解決できません。 シンボル:メソッドindexOf(char) 場所:java.long.Stringのクラス   if( str != null && str.indexof('a') != -1)              ^ なにをしたらいいのかわかりません。 教えてください。

    • ベストアンサー
    • Java
  • javaプログラミング この文章正確ですか?

    先ほど質問させていただきましたがもう一回質問させていただきます。 class Hello{ public static void main(String[] args) { System.out.println("まいど!”) ; javaの参考書で勉強しています。 これをコンパイルしろということなんですがコマンドプロンプトが読み取ってくれません。間違いがあったら教えてください!

    • ベストアンサー
    • Java
  • クラス名はどうするのですか?

    package ex7; public class Sample { public final static int VALUE = 100; } package ex7; import static ex7.Sample.VALUE; public class Main { private final static int VALUE = 0; public static void main(String[] args) { System.out.println(VALUE); } } 上記のプログラムのクラス名は何をつければいいですか・・・? 同じくプログラム名は何と付ければいいですか・・・? ご多忙中恐れいります・・・。 ご回答の程宜しくお願い申し上げます。 回答者 これが、素人さんには分かりにくいんですね。 mkdir ex7 で、ex7 というディレクトリを作製して、 その中に、 Sample.java を public class Sample { public final static int VALUE = 100; } で、 Main.java を package ex7; import static ex7.Sample.VALUE; public class Main { private final static int VALUE = 0; public static void main(String[] args) { System.out.println(VALUE); } } で作製して、 ex7 の中から出て、 javac ex7/Sample.java javac ex7/Main.java でコンパイルします。 質問者 度々すいません・・・。 ファイル名は何にすればいいですか・・・? ご回答がなかなか来ません。

    • ベストアンサー
    • Java
  • エラーなのですが…

    Javaコンパイルが成功して、クラスファイルは出来たのですがプロンプト画面上に Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/java と、表示されます。 原文は public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } です。なぜ例外が投げられるのでしょうか?すいませんが回答おねがいいたします。

    • ベストアンサー
    • Java
  • Javaアプリケーションについて

    次のようなプログラムを作ってコンパイルをしました。 public class app { public static void main(String[] args) { System.out.println("Hello from Java!"); } } コンパイルまではできるのですが、 java appで実行しようとすると Exception in thread "main" java.lang.NoClassDefFoundError:app となって、アプリケーションを実行することができません。 本には、これで実行できると書いてあるのですが・・・ どなたか教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう