4. Переносим файл Inp2java в каталог p2.
5. Снова делаем текущим каталог classes.
6. Компилируем второй файл, указывая путь p2\Inp2.java.
7. Запускаем программу java p2.Inp2.
Вместо шагов 2 и 3 можно просто создать три class-файла в любом месте, а потом перенести их в каталог p1. В class-файлах не хранится никакая информация о путях к файлам.
Смысл действий 5 и 6 в том, что при компиляции файла Inp2java компилятор уже должен знать класс p1.Base, а отыскивает он файл с этим классом по пути p1\Base.class, начиная от текущего каталога.
Обратите внимание на то, что в последнем действии (7) надо указывать полное имя класса.
Если использовать
1. Вызываем компилятор с ключом -d
javac -d classes Base.java
Компилятор создаст в каталоге classes подкаталог p1 и поместит туда три class-файла.
2. Вызываем компилятор с еще одним ключом -classpath
javac -classpath classes -d classes Inp2.java
Компилятор, руководствуясь ключом -d, создаст в каталоге classes подкаталог p2 и поместит туда два class-файла, при создании которых он "заглядывал" в каталог p1, руководствуясь ключом -classpath.
3. Делаем текущим каталог classes.
4. Запускаем программу java p2.Inp2.
Для "юниксоидов" все это звучит, как музыка, ну а прочим придется вспомнить
MS-DOS.
Конечно, если вы используете для работы не компилятор командной строки, а какой-нибудь IDE, вроде Eclipse или NetBeans, то все эти действия будут сделаны без вашего участия.
На рис. 3.3 показан вывод этих действий в окно Command Prompt и содержимое каталогов после компиляции.
Рис. 3.3. Протокол компиляции и запуска программы |
Импорт классов и пакетов
Внимательный читатель заметил во второй строке листинга 3.2 новый оператор import. Для чего он нужен?
Дело в том, что компилятор будет искать классы только в двух пакетах: в том, что указан в первой строке файла, и в пакете стандартных классов java.lang. Для классов из другого пакета надо указывать полные имена. В нашем примере они короткие, и мы могли бы писать в листинге 3.2 вместо Base полное имя p1. Base.
Но если полные имена длинные, а используются классы часто, то стучать по клавишам, набирая полные имена, становится утомительно. Вот тут-то мы и пишем операторы import, указывая компилятору полные имена классов.
Правила использования оператора import очень просты: пишется слово import и через пробел полное имя класса, завершенное точкой с запятой. Сколько классов надо указать, столько операторов import и пишется.
Это тоже может стать утомительным и тогда используется вторая форма оператора import — указывается имя пакета или подпакета, а вместо короткого имени класса ставится звездочка *. Этой записью компилятору предписывается просмотреть весь пакет. В нашем примере можно было написать
import p1.*;
Напомним, что импортировать разрешается только открытые классы, помеченные модификатором public.
Внимательный читатель и тут настороже. Мы ведь пользовались методами классов стандартной библиотеки, не указывая ее пакетов? Да, правильно.
Пакет java.lang просматривается всегда, его необязательно импортировать. Остальные пакеты стандартной библиотеки надо указывать в операторах import, либо записывать полные имена классов.
Начиная с версии Java SE 5 в язык введена еще одна форма оператора import, предназначенная для поиска статических полей и методов класса — оператор import static. Например, можно написать оператор
import static java.lang.Math.*;
После этого все статические поля и методы класса Math можно использовать без указания имени класса. Вместо записи
double r = Math.cos(Math.PI * alpha);
как мы делали раньше, можно записать просто
double r = cos(PI * alpha);
Подчеркнем, что оператор import вводится только для удобства программистов и слово "импортировать" не означает никаких перемещений классов.
Оператор import не эквивалентен директиве препроцессора include — он не подключает никакие файлы.
Java-файлы
Теперь можно описать структуру исходного файла с текстом программы на языке Java.
□ В первой строке файла может быть необязательный оператор package.
□ В следующих строках могут быть необязательные операторы import.
□ Далее идут описания классов и интерфейсов.
Еще два правила.
□ Среди классов файла может быть только один открытый public-класс.
□ Имя файла должно совпадать с именем открытого класса, если последний существует.
Отсюда следует, что если в проекте есть несколько открытых классов, то они должны находиться в разных файлах.
Соглашение "Code Conventions" рекомендует открытый класс, если он имеется в файле, описывать первым.
Для технологии Java характерно записывать исходный текст каждого класса в отдельном файле. В конце концов, компилятор всегда создает class-файл для каждого класса.