Каково влияние точки (.) В пути к классам Java?

Это пример вопроса из "Макетного экзамена SCJP":

Учитывая путь к классу по умолчанию:

/ Foo

И эта структура каталогов:

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

И эти два файла:

package xcom;
public class A { }
package xcom;
public class B extends A { }

Что позволяет B.java компилировать? (Выберите все подходящие варианты.)

A. Установите текущий каталог в xcom затем вызвать

javac B.java

Б. Установите текущий каталог на 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.class находится в xcom пакет, который не найдет компилятор A.class если он вызывается из xcom каталог. Помните, что -classpath не ищет B.java Смотрю какие занятия B.java потребности (в этом случае A.class).

Я не понимаю, если оба файла находятся в одном пакете, почему компилятор не может найти A?

4 ответа

Точка означает "текущий каталог". Если вы позвоните в Javac изнутри xcomтогда будет искать A.class в xcom/xcom/A.classи не найдет его.

Для того чтобы B.java для компиляции, компилятор должен сначала найти B.java,

Вот почему Д. и Е. ошибаются.

Как только это найдено B.java нужно найти A.class, Потому что А.Класс находится в xcom пакет, который не найдет компилятор A.class если он вызывается из xcom каталог. (...)

Вы пропустили важную часть здесь, если она вызывается из xcom каталог. A.class находится в xcom пакет, так что ожидается найти в xcom/A.class (относительно того, где вы запускаете Javac).

Вот почему А. и Б. ошибаются. И это оставляет C. как правильный ответ.

Нет оператора ., . означает текущий каталог. С классом A находится в xcom пакет и с тех пор, с javac, иерархия каталогов отражает иерархию пакетов, вы должны иметь каталог в пути к классам, из которого файл xcom/A.class может быть найден. В вашем случае это test каталог, поэтому, когда вы вызываете javac в этом каталоге, давая текущий каталог в пути к классам, javac найдет класс xcom.A от xcom каталог.

Я тоже запутался, читая твою цитату из книги.

В любом случае компилятор будет искать A.class и потому что он находится в той же упаковке, что и B.javaбудет искать xcom/A.class, Это означает, что вы должны указать компилятору, где найти ваши пакеты, и вы делаете это с -classpath,

В вашем примере ваши пакеты (это может быть более одного) находятся в test и это то, что вы говорите компилятору с точкой, так как вы находитесь в тесте.

Короче говоря, компилятор ищет класс, добавляя префикс имени пакета в качестве каталога.

Другие вопросы по тегам