Директивы
, такие как объявление package
, а также операторы import
, вообще не генерируют никакого кода, они только влияют на то, как компилятор будет обрабатывать имена в одной и той же единице компиляции.
Так что декларация вроде
package abc.xyz;
public class MyClassA {
}
создает класс с полным именем abc.xyz.MyClassA
или класс с простым именем MyClassA
в пакете abc.xyz
; оба означают одно и то же.
Полное имя хранится в файле .class
, который является единственной соответствующей информацией для JVM.
Существует соглашение для хранения такого файла как SimpleName.class
в каталоге, полученном из имени пакета, то есть abc/xyz/MyClassA.class
, присоединенного javac
и используемого стандартными загрузчиками классов для поиска файл, когда запрашивается класс с таким именем. Очевидно, что такое соглашение облегчает жизнь.
В принципе, возможны другие способы хранения, и некоторые из них известны. Начиная с Java 9, эталонная реализация имеет формат изображения модуля, до этого был «архив данных общего класса», далее был «Pack200», формат архива, который не рекомендуется для удаления с JDK 11.
Обратите внимание, что даже jar-файлы, которые являются расширенными zip-файлами, не совсем то, что вы видите. Zip-файл состоит из линейной последовательности файловых записей, имеющих полное имя, поэтому в вашем случае у вас будет две записи, сообщающие об их именах как abc/xyz/MyClassA.class
и abc/xyz/MyClassB.class
, тогда как любая структура каталогов, показанная инструментами, на самом деле получается из этих имена и не подразумевает, что вложенные записи для abc
и xyz
действительно существуют. Тем не менее, стандартный загрузчик классов также будет использовать эти записи так же, как если бы существовала эта структура каталогов, поэтому нет проблем с тем, чтобы сохранить структуру каталогов в файле zip / jar.
Но начиная с Java 9, для одного и того же класса могут быть разные версии, которые будут выбраны в зависимости от текущей версии Java. Используемая для этого схема именования не является частью соглашения, используемого javac при хранении файлов.