4

これは「SCJP 模擬試験」の出題例です。

デフォルトのクラスパスを考えると:

/foo

そして、このディレクトリ構造:

foo
  |
 test
    |
   xcom
     |--A.class
     |--B.java

そして、これらの 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.現在のディレクトリをテストしてから呼び出すように設定します

javac -classpath . xcom/B.java

D.現在のディレクトリをテストして呼び出すように設定します

javac -classpath xcom B.java

E.テストする現在のディレクトリを設定してから呼び出す

javac -classpath xcom:. B.java

答えは C です。そこでの演算子の使い方がわかりません.。説明してください。

本は言う:

B.javaコンパイルするには、コンパイラが最初に を見つけられる必要がありますB.java。見つかったらB.java、見つける必要がありますA.classパッケージ内にある ためA.classxcomA.classxcom、ディレクトリから呼び出された場合、コンパイラは検出されません。-classpathは を探しているのではなく、必要B.javaなクラス B.java(この場合は) を探していることに注意してくださいA.class

わかりません。両方のファイルが同じパッケージにある場合、コンパイラはなぜ A を見つけられないのでしょうか?

4

4 に答える 4

5

ドットは「現在のディレクトリ」を意味します。内から javac を呼び出すと、 inxcomが検索されますが、見つかりません。A.classxcom/xcom/A.class

于 2009-12-13T17:51:08.810 に答える
3

B.javaコンパイルするには、コンパイラが最初に を見つけられる必要がありますB.java

これが、D. と E. が間違っている理由です。

見つかったらB.java、見つける必要がありますA.class。A.class はパッケージ内にあるため、ディレクトリから呼び出された場合xcom、コンパイラは検出できません。(...)A.classxcom

ここで、ディレクトリから呼び出された場合xcomの重要な部分を見逃しています。A.classはパッケージに含まれているため、 (javac を実行する場所に対して相対的に) にxcomあると予想されます。xcom/A.class

これが、A. と B. が間違っている理由です。そして、これは C. を正解として残します。

于 2009-12-13T20:13:52.597 に答える
1

現在のディレクトリを意味する.operatorはありません。.クラスAxcomパッケージ内にあり、javacでは、ディレクトリ階層がパッケージ階層を反映しているため、ファイルxcom/A.classを見つけることができるクラスパスにディレクトリが必要です。あなたの場合、それはtestディレクトリであるため、そのディレクトリで呼び出すjavacと、クラスパスに現在のディレクトリを指定すると、ディレクトリからjavacクラスが見つかります。xcom.Axcom

于 2009-12-13T17:52:27.630 に答える
0

あなたの本の引用を読んでいる間、私も混乱しました。

いずれにせよ、コンパイラはand を探します。これA.classは と同じパッケージにあるためB.java、 を探しますxcom/A.class。つまり、パッケージを見つける場所をコンパイラに伝える必要があり、これを で行い-classpathます。

あなたの例では、パッケージ(複数の可能性があります)が含まれtestており、テスト中なので、ドットでコンパイラに伝えています。

つまり、コンパイラは、パッケージ名の前にディレクトリを付けてクラスを検索します。

于 2009-12-13T17:54:13.047 に答える