Перейти к содержимому
Теория · Первая программа · урок 7 из 8

Метод main

Строку public static void main(String[] args) мы до сих пор переписывали целиком, не разбирая. Пора узнать, зачем в ней каждое слово.

Концерт начинается с первой ноты: дирижёр поднимает палочку, и оркестр вступает с первого такта. У программы тоже есть место, откуда начинается выполнение, — точка входа. В Java это метод main. При запуске JVM ищет в классе метод с этим именем и вызывает его.

JAVA
public class Main {
    public static void main(String[] args) {
        System.out.println("Start"); // Start
    }
}

Здесь картинка с концертом неточна. Концерт начинается с первой страницы партитуры, а программа — не с первой строки файла, а с метода main, где бы он ни стоял в классе.

Слово за словом

Заголовок метода main состоит из пяти частей:

  1. public — метод открыт для вызова снаружи класса. Так его и вызывает JVM при запуске.
  2. static — метод принадлежит самому классу, и для его вызова не нужен объект. Это слово мы разберём ниже отдельно.
  3. void — метод ничего не возвращает: он выполняет свои инструкции и заканчивается, не отдавая результата.
  4. main — имя, по которому JVM находит точку входа. Оно пишется только строчными буквами.
  5. (String[] args) — строки, которые можно передать программе при запуске. String[] означает «несколько строк», а args — имя для них.

Зачем main слово static

Это классический вопрос собеседования: почему main статический? Чтобы ответить, нужна ещё одна картинка.

Класс похож на чертёж дома. По чертежу можно построить сколько угодно домов, и в Java их называют объектами. Обычный метод — действие конкретного дома: включить в нём свет можно, только когда дом построен. Метод со словом static принадлежит самому чертежу, и вызвать его можно, не построив ни одного дома.

При запуске программы объектов ещё нет. Поэтому JVM вызывает main прямо у класса, и разрешает это именно static. Ответ на собеседовании: main статический, чтобы JVM могла вызвать его до того, как создан хоть один объект.

С Java 25 main может обойтись и без static: тогда JVM сначала сама создаёт объект класса и вызывает main у него. На Java 21 такая программа не запустится, поэтому в курсе main всегда статический.

Аргументы запуска

Слова, которые стоят в команде запуска после имени файла, попадают в args. После команды java Main.java Anna Bob в args окажутся две строки: Anna и Bob. Программы этой темы ничего не передают, и args остаётся пустым.

Компактный файл Java 25

В Java 25 появилась короткая запись для маленьких программ — компактный файл. Класс в нём не объявляют, у main нет ни public static, ни args, а печатает IO.println:

JAVA
void main() {
    IO.println("Hello, Java"); // Hello, Java
}

Такой файл тоже сохраняют, например, как Main.java и запускают командой java Main.java. Компилятор сам создаёт для него класс и называет его по имени файла. IO.println печатает так же, как System.out.println.

Компактный файл вы встретите в свежих учебниках по Java. В этом курсе программы пишутся в классической форме, с классом Main: такой код работает и в Java 17 и 21, которые чаще всего стоят на работе и встречаются на собеседованиях.

Частая ошибка

Имя метода написали с заглавной буквы:

JAVA
public class Main {
    public static void Main(String[] args) { // ✗
        System.out.println("Start");
    }
}
TEXT
error: can't find main(String[]) or main() method in class: Main

Компилятор ошибки не видит: Main — допустимое имя для метода, и он не знает, что вы имели в виду main. Ошибка появляется уже при запуске: JVM ищет метод main строчными буквами и не находит его. При запуске в два шага, командой java Main, сообщение другое, но смысл тот же: Error: Main method not found in class Main. Исправьте Main на main.

Главное

  • main — точка входа: при запуске JVM ищет в классе метод main и вызывает его.
  • public открывает метод для вызова снаружи, void значит «ничего не возвращает», String[] args — строки из команды запуска.
  • main статический, чтобы JVM могла вызвать его у класса, пока не создано ни одного объекта.
  • Компактный файл Java 25 — это void main() и IO.println; в курсе используется классическая форма, которая работает и в Java 17 и 21.