JAVAで解答が納得いかなかったので教えてください

正解はCだそうです。Bだと思うのは何か勘違いをしているからなのでしょうか?
どうかよろしくお願いします


次のデフォルトパスがあります
/foo

ディレクトリ構造は次のようになっています
foo

test

xcom
├ A.class
└ B.class

そして次の2つのファイルがあります
package xcom;
public class A{}

package xcom;
public class B extends A{}


どうすればB.javaがコンパイルされますか?

A.現在のディレクトリをxcomに設定してから次のコマンドを実行する
 javac B.java

B.現在のディレクトリをxcomに設定してから次のコマンドを実行する
 javac -classpath . B.java

C.現在のディレクトリをtestに設定してから次のコマンドを実行する
 javac -classpath . xcom/B.java

D.現在のディレクトリをtestに設定してから次のコマンドを実行する
 javac -classpath xcom B.java

E.現在のディレクトリをtestに設定してから次のコマンドを実行する
 javac -classpath xcom:. B.java

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/12/27 19:50:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:yoshifumi1975 No.2

回答回数58ベストアンサー獲得回数10

ポイント23pt

クラスパスとコンパイル対象のファイルの指定は分けて考えます。ごっちゃにしないでください。


A. B.javaのコンパイル時にA.classが見つからない。クラスパスが通っていないから。

B. B.javaのコンパイル時にA.classが見つからない。クラスパスにより、foo/test/xcom/xcom/A.class を探そうとします。ミスタイプではありません。今いるところから、xcom/A.class を探そうとします。

C. B.javaのコンパイル時にA.classを探します。今いるところ(test)から、xcom/A.class を探します。A.classがみつからずA.javaが見つかるとそれも勝手にコンパイルしてくれます。

D. B.javaのコンパイル時にA.classを探します。今いるところにあるxcomの中から、xcom/A.class を探します。つまり、foo/test/xcom/xcom/A.class を探そうとします。もちろん見つかりません。ミスタイプではありません。

E. コンパイル対象のファイル B.java がそのディレクトリにはありませんのでコンパイルが失敗します。コンパイル対象のファイルのパスが間違っています。

その他の回答3件)

id:aiaida333 No.1

回答回数166ベストアンサー獲得回数4

ポイント23pt

クラスパスを通さないと

コンパイルが通らないからじゃないでしょうか。

実際に試してみたら、コンパイルが通るかわかると思いますよ。

http://q.hatena.ne.jp/1261306118

id:yoshifumi1975 No.2

回答回数58ベストアンサー獲得回数10ここでベストアンサー

ポイント23pt

クラスパスとコンパイル対象のファイルの指定は分けて考えます。ごっちゃにしないでください。


A. B.javaのコンパイル時にA.classが見つからない。クラスパスが通っていないから。

B. B.javaのコンパイル時にA.classが見つからない。クラスパスにより、foo/test/xcom/xcom/A.class を探そうとします。ミスタイプではありません。今いるところから、xcom/A.class を探そうとします。

C. B.javaのコンパイル時にA.classを探します。今いるところ(test)から、xcom/A.class を探します。A.classがみつからずA.javaが見つかるとそれも勝手にコンパイルしてくれます。

D. B.javaのコンパイル時にA.classを探します。今いるところにあるxcomの中から、xcom/A.class を探します。つまり、foo/test/xcom/xcom/A.class を探そうとします。もちろん見つかりません。ミスタイプではありません。

E. コンパイル対象のファイル B.java がそのディレクトリにはありませんのでコンパイルが失敗します。コンパイル対象のファイルのパスが間違っています。

id:mattn No.3

回答回数104ベストアンサー獲得回数23

ポイント22pt

B.javaは既にパッケージ名を持っています。Javaのパッケージはディレクトリ階層を意味し、実際に出来上がるclassファイルやjarで圧縮された物を見ると、パッケージ名どおりにディレクトリ構成分けされているのが変わるかと思います。

javacは、何もオプションを付けずに実行するとそこ(カレントディレクトリ)をパッケージルート(検索パス)として扱う様になっており、パッケージルートから見たB.javaは、xcomの中にいるべきものになります。

よって何もオプションを付けなかった場合には、パッケージルートから相対パスで「javac xcom/B.java」とするのが正しくなります。

回答Bは、xcomというディレクトリにいて「package xcom」のファイルをコンパイルしようとしていますので

xcom
  xcom
   B.java
  ※ここでコンパイル

という階層のファイルをコンパイルしようとしている事を意味します。

パッケージルート(検索パス)を指定するには-sourcepathオプションを使います。

http://www.atmarkit.co.jp/fjava/onepoint/java/jv_jvc.html

http://www.stackasterisk.jp/tech/java/javac01_03.jsp

id:azuco1975 No.4

回答回数613ベストアンサー獲得回数16

ポイント22pt

Javaの場合はディレクトリ(フォルダー)とパッケージ名が一致しないとだめだから、

Bでは、とおらないのです。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません