Ответ 1
Между .java файлами и .class файлами нет отношения "один-к-одному". То, что у вас есть, - это взаимно однозначное отношение между классами (или объявлениями классов) и .class-files.
Java-исходный файл с нулевыми объявлениями класса не приведет к каким-либо файлам .class
, поэтому он вообще не обрабатывается JVM.
$ touch Test.java
$ ls
Test.java
$ javac Test.java
$ ls
Test.java
В спецификации языка Java файл с исходным кодом Java является синонимом модуля компиляции. Соответствующий раздел в JLS 7.3 Компиляционные единицы.
Грамматика описывается следующим образом:
CompilationUnit:
PackageDeclaration opt ИмпортDeclarations opt ТипDeclarations opt
...
opt -subscript говорит, что деталь является необязательной. Поскольку TypeDeclarations не является обязательным, объявления классов не должны существовать.