Истинной точкой входа в любое приложение является статический метод. Если бы язык Java поддерживал метод экземпляра в качестве «точки входа», то среда выполнения должна была бы реализовать его внутренне как статический метод, который создавал экземпляр объекта с последующим вызовом метода экземпляра.
После этого я рассмотрю обоснование выбора конкретного из следующих трех вариантов:
- A
static void main()
как мы видим сегодня.
- Метод экземпляра
void main()
, вызываемый для только что созданного объекта.
- Использование конструктора типа в качестве точки входа (например, если класс входа был назван
Program
, тогда выполнение фактически будет состоять из new Program()
).
Разбивка:
static void main()
- Вызывает статический конструктор класса включения.
- Вызывает статический метод
main()
.
void main()
- Вызывает статический конструктор окружающего класса.
- Создает экземпляр окружающего класса, эффективно вызывая
new ClassName()
.
- Вызывает метод экземпляра
main()
.
new ClassName()
- Вызывает статический конструктор класса включения.
- Создает экземпляр класса (затем ничего с ним не делает и просто возвращает).
Обоснование:
Я пойду в обратном порядке к этому.
Имейте в виду, что одной из целей разработки Java было подчеркнуть (требовать, когда это возможно) хорошие методы объектно-ориентированного программирования. В этом контексте конструктор объекта инициализирует объекта, но не должен отвечать за поведение объекта. Таким образом, спецификация, которая давала точку входа new ClassName()
, могла бы запутать ситуацию для новых разработчиков Java, вынудив исключить конструкцию «идеального» конструктора в каждом приложении.
Сделав main()
методом экземпляра, вышеуказанная проблема, безусловно, решена. Однако это усложняет задачу, требуя, чтобы спецификация перечисляла сигнатуру конструктора класса входа, а также сигнатуру метода main()
.
В итоге, при указании static void main()
создает спецификацию с наименьшей сложностью, придерживаясь принципа размещения поведения в методах . Учитывая простоту реализации метода main()
, который сам создает экземпляр класса и вызывает метод экземпляра, нет никакого реального преимущества в определении main()
в качестве метода экземпляра.