Перейти к основному содержимому

public static void main — точка входа JVM

Разработчику

Точка входа Java — метод public static void main(String[] args). JVM вызывает его только когда вы явно запускаете класс как программу: java com.example.App.

См. также: Первая программа · путь от исходника до запуска · Python — аналог __main__.


Что делает main

Часть сигнатурыСмысл
publicJVM может вызвать метод извне
staticВызов без создания объекта класса
voidНе возвращает значение процессу ОС (код выхода задаётся отдельно)
String[] argsАргументы командной строки

Консольные шаблоны (Scanner, чтение массива, сумма двух чисел) с разбором — Lab — консольные задачи на Java.

public class Hello {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}

Запуск (после компиляции):

javac Hello.java
java Hello

IDE и Maven указывают главный класс в конфигурации запуска — по сути тот же выбор, что и java Hello.


Чем это отличается от Python __main__

В Python при импорте модуля выполняется весь код верхнего уровня. В Java импорт класса (import com.example.Calculator;) не вызывает main и не создаёт экземпляр.

public class Calculator {
public static int add(int a, int b) {
return a + b;
}

public static void main(String[] args) {
System.out.println(add(5, 3));
}
}
ДействиеВыполнится ли main
java CalculatorДа
Другой класс использует Calculator.add(10, 20)Нет

Отдельный метод main в Java — встроенный аналог блока if __name__ == "__main__":: демо и CLI живут в main, API класса — в остальных методах.


Static-блоки и загрузка класса

При первой загрузке класса JVM выполняет static initializer — блок static { … } и присваивания static-полям. Это происходит и при import, если класс реально загружается.

public class Demo {
static {
System.out.println("Класс Demo загружен");
}

public static void main(String[] args) {
System.out.println("main");
}
}

main при импорте без запуска не вызывается, но static-блок может выполниться, если другой код впервые обратился к классу. Тяжёлые побочные эффекты в static-блоках для библиотек — плохая практика.


Несколько классов с main

В одном JAR может быть много классов с main. Запускается один, указанный в манифесте (Main-Class:) или в IDE / java -cp … com.example.App.

Spring Boot и другие фреймворки часто генерируют свой main — вы вызываете SpringApplication.run, а не пишете цикл сервера вручную.


Когда нужен отдельный main

СитуацияПодход
Консольная утилита, учебный примерКласс с main
Библиотека для других модулейПубличные API без запуска; тесты в JUnit
Веб-приложениеmain поднимает контекст Spring; WAR деплоится в servlet-контейнер без вашего main
Привычка из Python

Если привыкли оборачивать запуск в if name == "main", в Java эквивалент — вынести логику в public static void main или в метод run(), который вызывается только из main.


Дальше по разделу

ТемаСтатья
Первая программа, Maven, IDEA13 — Первая программа
Пакеты и classpath12 — Структура и сборки
JUnitраздел тестирования

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").