Пакеты в Java
Положите класс Bell в папку с именем kit с первой строкой package kit; и статическим методом ring(), который печатает ding. В Lobby.java рядом с этой папкой — не внутри kit — вызовите из main kit.Bell.ring();. Скомпилируйте из родительской папки и запустите java Lobby. Экран должен показать одну строку: ding. Имя пакета и имя папки совпадают. Вызов с kit.Bell впереди — то, чему учит эта страница. Слово import оставьте для следующей страницы.
Имя папки, которое объявляет файл
До сих пор каждый класс лежал в одной плоской папке. Пакет группирует классы под именем папки. Первая строка файла должна назвать это имя: package kit;. Файл Bell.java должен жить внутри папки kit. Если папка и строка package не совпадают, javac жалуется.
Сначала создайте папку kit. Внутри неё создайте Bell.java. Первая строка — package kit;. Затем строка public class — public class Bell. Не оставляйте здесь старое имя класса Gate или Tag. Напишите один статический метод:
public static void ring() { System.out.println("ding"); }
Поставьте на метод public, чтобы класс вне пакета мог его вызвать. В Bell.java нет main. Сохраните перед компиляцией.
package kit;
public class Bell {
public static void ring() {
System.out.println("ding");
}
}
Lobby вызывает kit.Bell.ring
Создайте Lobby.java в родительской папке — на том же уровне, что и папка kit, не внутри kit. Его строка public class — public class Lobby. Внутри main напишите kit.Bell.ring();. На этой странице не пишите import kit.Bell;. Полного имени kit.Bell достаточно для вызова.
Держите Lobby как класс, в котором есть main. Не кладите main внутрь Bell для этого урока. Если рядом ещё лежит оставшийся файл Pier со страницы access, не запускайте для этого урока java Pier — после компиляции из родительской папки выполните java Lobby.
public class Lobby {
public static void main(String[] args) {
kit.Bell.ring();
}
}
Из родительской папки, где лежат и Lobby.java, и папка kit, выполните javac kit/Bell.java Lobby.java. В Windows тот же смысл с kit\Bell.java — направьте javac на файл внутри папки пакета, затем на Lobby.java. Когда скобки, фигурные скобки и точки с запятой совпадают, javac не пишет своей строки. Затем запустите java Lobby — не java Lobby.java и не java kit.Bell. Уберите окончание .java из команды запуска. Запускайте класс, в котором есть main. Те же команды работают в Windows и в macOS, когда пути совпадают с вашей оболочкой.
Программа должна напечатать одну строку и остановиться: ding. Она не просит вас вводить текст. Если терминал ждёт ввода с клавиатуры, в каком-то файле ещё остался вызов nextLine из старого упражнения. Удалите этот вызов и оставьте в Lobby kit.Bell.ring();, а в Bell — package kit;.
Пройдите запуск один раз. Java начинает с Lobby.main. Вызов kit.Bell.ring() находит класс Bell в пакете kit и выполняет статический метод. Тело печатает ding. Экран показывает ding. Больше ничего печататься не должно. Если вы видите 9 или ok, вы всё ещё запускаете старую программу Pier или Yard с предыдущей страницы.
Если Bell.java лежит рядом с Lobby.java без папки kit, а файл всё ещё говорит package kit;, javac отказывает. Переместите файл в kit. Если вы вызовете Bell.ring(); без kit. извне пакета, javac на этой странице не увидит короткое имя — держите kit.Bell.ring();. Имя пакета — часть полного имени типа, пока следующая страница не научит import.
Папка и строка package рядом
Короткая таблица держит совпадение ясным.
📊 folder vs package line
| Часть | На этой странице |
|---|---|
| имя папки | kit |
| первая строка в Bell.java | package kit; |
| вызов из Lobby | kit.Bell.ring(); |
| import | не на этой странице — следующий урок |
Таблица только напоминание. Набранные куски, которые вы держите: package kit; в файле Bell, путь файла под kit и kit.Bell.ring(); в Lobby. |
Сравнение с access и с плоской папкой
На странице access Gate и Pier делили одну папку с private-полем. Это по-прежнему работает. Эта страница добавляет папку пакета и строку package. Оставшееся демо Gate g = new Gate(9); g.show(); — другой урок. Для этой страницы держите kit/Bell.java, Lobby.java и kit.Bell.ring();.
Вы по-прежнему можете использовать плоские папки для крошечных демо. Этот урок выбирает пакет, чтобы вы увидели имя перед классом. Не смешивайте g.show() и kit.Bell.ring() в одном демо Lobby на этой странице. Одного ясного пути достаточно: строка package, совпадающая папка, полный вызов из Lobby.
Компилируйте из родителя, а не только изнутри kit
Оставайтесь в родительской папке, когда компилируете и когда запускаете java Lobby. Если вы сделаете cd внутрь kit и попробуете запустить Lobby оттуда без настройки classpath, короткий путь урока ломается. Держите родителя рабочей папкой для этой страницы. Файл .class для Bell должен появиться под kit после удачной компиляции, рядом с Bell.java.
Если экран показывает 9 или ok, всё ещё работает старая программа Pier или Yard. Переключитесь на java Lobby. Если javac не находит kit.Bell, проверьте написание имени папки и строку package kit; посимвольно.
Что остаётся для import
Эта страница набирает полное имя kit.Bell при каждом вызове. Более поздняя страница — import — показывает, как import kit.Bell; позволяет писать короткое имя Bell в Lobby. Здесь оставайтесь с полным именем. Не изобретайте import на этой странице, если только вы уже его не знаете; цель урока — папка пакета и kit.Bell.ring();.
Когда старые файлы Gate.java или Pier.java ещё лежат в родительской папке, не трогайте их или удалите только если они путают команду компиляции. После компиляции пакетной пары с этого урока запустите java Lobby.
Перед import
Вы можете положить Bell.java под папку kit с package kit; и public static void ring(), который печатает ding, и из Lobby вызвать kit.Bell.ring(); без import. Скомпилируйте из родительской папки и запустите java Lobby. Экран показывает ding. Имя пакета совпало с папкой. Следующая страница — import, где после строки import короткого имени достаточно.
Держите package kit; первой строкой в Bell. Держите файл внутри kit. Держите вызов как kit.Bell.ring();. Эти три привычки — контрольная точка этой страницы перед тем, как идти дальше. Когда экран показывает ding из родительской папки, раскладка пакета делает свою работу для этого урока.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху