Подтвердить что ты не робот

Почему файл Java должен иметь то же имя, что и его открытый класс?

Возможный дубликат:
Почему имя файла в java должно быть таким же, как имя класса?

У меня есть один файл с именем temp.java. Я написал следующий код. Почему это работает?

class demo //not public keyword and not same as filename
{
    public static void main(String []args)
    {
        System.out.println("this is Main method");
    }
}

Почему это не работает?

public class demo
{
    public static void main(String []args)
    {
        System.out.println("this is Main method");
    }
}
4b9b3361

Ответ 1

В первом примере ваш класс фактически объявлен как "закрытый пакет" (без модификаторов), что означает, что к нему могут обращаться только классы из одного пакета. Во втором примере вы объявили его общедоступным.

Это сценарий, в котором компилятор достаточно хорошо встретил JLS.

Состояние JLS:

Когда пакеты хранятся в файловой системе (§7.2.1), хост-система может выбрать принудительное ограничение того, что это ошибка времени компиляции, если тип не найден в файле под именем, состоящим из введите имя типа плюс расширение (например .java или .jav), если выполняется одно из следующих условий:

  • Тип ссылается кодом в других единицах компиляции пакета, в котором объявлен тип.
  • Тип объявляется открытым (и, следовательно, потенциально доступен из кода в других пакетах).

Это ограничение подразумевает, что на единицу компиляции должно быть не более одного такого типа. Это ограничение упрощает компилятор для языка программирования Java или реализации виртуальной машины Java для поиска именованного класса в пакете; например, исходный код для открытого типа wet.sprocket.Toad будет найден в файле Toad.java в каталоге wet/sprocket, а соответствующий объектный код будет найден в файле Toad.class в том же каталоге.

Это означает, что для сценария 1 это потому, что у вас есть только temp.java с закрытым классом пакета demo, он не ссылается на код в каких-либо других единицах компиляции пакета, поэтому он будет компилироваться без проблема.

Второй сценарий объявил открытый класс, что означает, что он потенциально доступен из кода в других пакетах, поэтому он должен соответствовать стандартам, что имя класса равно имени файла.

Если вы создали другой класс в первом сценарии (в том же пакете), а затем попытались ссылаться на класс demo, вы должны получить ошибку компиляции.