Каково влияние точки (.) В пути к классам 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
и это то, что вы говорите компилятору с точкой, так как вы находитесь в тесте.
Короче говоря, компилятор ищет класс, добавляя префикс имени пакета в качестве каталога.