В Java оператор package
определяет пространство имен вашего класса. Здесь вы следуете руководству, и в нем содержится инструкция по использованию пакета com.zetcode
. Это нормально, но пакет также определяет структуру каталогов, в которой должны находиться ваши файлы. Здесь ваш объект Shape должен находиться в этой структуре папок:
src/com/zetcode/Shape.java
Оставив Shape.java
в root вашей папки src/
вы говорите, что у класса нет пакета (или, скорее, у него есть безымянный пакет по умолчанию), поэтому, когда компилятор видит оператор package
в исходном коде, он выдает ошибку, которая вы видите.
Решение
Простейшее решение - переместить исходные файлы в структуру папок, которая соответствует их пакетным инструкциям. Только представьте, что точки, разделяющие слова в имени пакета, являются косой чертой (разделителями путей). Создайте каталог src/com/zencode
и переместите файлы в эту папку. Компилятор должен быть счастливее.
Подробнее о пакетах
Имена пакетов важны, потому что они позволяют Java явно знать, какой класс используется. У вас может быть много классов Shape
, если они находятся в разных пакетах, но когда вы import
конкретный класс c с его пакетом, компилятор точно знает, что загружать.
Также вы Вы можете заметить, что имена пакетов часто начинаются с обратной стороны домена веб-сайта компании-производителя. Например, com.abcxyz
будет началом имени пакета для классов, которые компания использует www.abcxyz.com
в качестве своего веб-сайта. Плохая идея использовать чужое имя пакета в вашем коде, потому что это подразумевает, что код, который вы пишете, создан этой компанией или организацией.
Вы сказали, что когда вы удалили или изменили инструкцию пакета, у вас были другие ошибки . Вероятно, это потому, что другие классы (например, Board. java) неявно импортируют класс Shape, потому что они находятся в одном пакете, и компилятор не может его найти, если вы измените имя пакета Shape. Вам нужно будет изменить операторы пакета для всех других классов, чтобы они соответствовали новому пакету. Думайте об этом как о семье, живущей по адресу. Если они переехали, им всем нужно знать свой новый адрес. Здесь «семья» - это набор классов, которые принадлежат друг другу (в вашем случае Shape, Board, Tetris), а имя пакета - это их адрес.