Ответ 1
В первом примере ваш класс фактически объявлен как "закрытый пакет" (без модификаторов), что означает, что к нему могут обращаться только классы из одного пакета. Во втором примере вы объявили его общедоступным.
Это сценарий, в котором компилятор достаточно хорошо встретил JLS.
Когда пакеты хранятся в файловой системе (§7.2.1), хост-система может выбрать принудительное ограничение того, что это ошибка времени компиляции, если тип не найден в файле под именем, состоящим из введите имя типа плюс расширение (например .java или .jav), если выполняется одно из следующих условий:
- Тип ссылается кодом в других единицах компиляции пакета, в котором объявлен тип.
- Тип объявляется открытым (и, следовательно, потенциально доступен из кода в других пакетах).
Это ограничение подразумевает, что на единицу компиляции должно быть не более одного такого типа. Это ограничение упрощает компилятор для языка программирования Java или реализации виртуальной машины Java для поиска именованного класса в пакете; например, исходный код для открытого типа wet.sprocket.Toad будет найден в файле Toad.java в каталоге wet/sprocket, а соответствующий объектный код будет найден в файле Toad.class в том же каталоге.
Это означает, что для сценария 1 это потому, что у вас есть только temp.java
с закрытым классом пакета demo
, он не ссылается на код в каких-либо других единицах компиляции пакета, поэтому он будет компилироваться без проблема.
Второй сценарий объявил открытый класс, что означает, что он потенциально доступен из кода в других пакетах, поэтому он должен соответствовать стандартам, что имя класса равно имени файла.
Если вы создали другой класс в первом сценарии (в том же пакете), а затем попытались ссылаться на класс demo
, вы должны получить ошибку компиляции.