正解は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
クラスパスとコンパイル対象のファイルの指定は分けて考えます。ごっちゃにしないでください。
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 がそのディレクトリにはありませんのでコンパイルが失敗します。コンパイル対象のファイルのパスが間違っています。
クラスパスを通さないと
コンパイルが通らないからじゃないでしょうか。
実際に試してみたら、コンパイルが通るかわかると思いますよ。
クラスパスとコンパイル対象のファイルの指定は分けて考えます。ごっちゃにしないでください。
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 がそのディレクトリにはありませんのでコンパイルが失敗します。コンパイル対象のファイルのパスが間違っています。
B.javaは既にパッケージ名を持っています。Javaのパッケージはディレクトリ階層を意味し、実際に出来上がるclassファイルやjarで圧縮された物を見ると、パッケージ名どおりにディレクトリ構成分けされているのが変わるかと思います。
javacは、何もオプションを付けずに実行するとそこ(カレントディレクトリ)をパッケージルート(検索パス)として扱う様になっており、パッケージルートから見たB.javaは、xcomの中にいるべきものになります。
よって何もオプションを付けなかった場合には、パッケージルートから相対パスで「javac xcom/B.java」とするのが正しくなります。
回答Bは、xcomというディレクトリにいて「package xcom」のファイルをコンパイルしようとしていますので
xcom xcom B.java ※ここでコンパイル
という階層のファイルをコンパイルしようとしている事を意味します。
パッケージルート(検索パス)を指定するには-sourcepathオプションを使います。
コメント(0件)