Прототип public static void main(String[])
- это соглашение, определенное в JLS :
Метод main должен быть объявлен как public, static и void. Он должен указывать формальный параметр (§8.4.1), объявленный тип которого является массивом String.
В спецификации JVM 5.2. Запуск виртуальной машины мы можем прочитать:
Виртуальная машина Java запускается путем создания начального класса, который определяется способом, зависящим от реализации, с помощью загрузчика классов начальной загрузки (§5.3.1). Затем виртуальная машина Java связывает исходный класс, инициализирует его и вызывает метод открытого класса void main (String []) . Вызов этого метода приводит к дальнейшему выполнению. Выполнение инструкций виртуальной машины Java, составляющих основной метод, может вызвать связывание (и, следовательно, создание) дополнительных классов и интерфейсов, а также вызов дополнительных методов.
Забавно, в спецификации JVM не упоминается, что основной метод должен быть статическим.
Но в спецификации также сказано, что виртуальная машина Java выполняет 2 шага раньше:
Инициализация класса или интерфейса состоит из выполнения его метода инициализации класса или интерфейса.
В 2,9. Специальные методы :
A метод инициализации класса или интерфейса определен:
Класс или интерфейс имеют не более одного метода инициализации класса или интерфейса и инициализируются (§5.5), вызывая этот метод. Метод инициализации класса или интерфейса имеет специальное имя <clinit>
, не принимает аргументов и является недействительным.
И метод инициализации класса или интерфейса отличается от метода инициализации экземпляра , определенного следующим образом:
На уровне виртуальной машины Java каждый конструктор, написанный на языке программирования Java (§8.8 JLS), отображается как метод инициализации экземпляра со специальным именем <init>
.
Таким образом, JVM инициализирует класс или метод инициализации интерфейса , а не метод инициализации экземпляра , который на самом деле является конструктором.
Поэтому им не нужно упоминать, что метод main должен быть статическим в спецификации JVM, поскольку это подразумевается тем фактом, что ни один экземпляр не создается до вызова метода main.