Метод main
Строку public static void main(String[] args) мы до сих пор переписывали целиком, не разбирая. Пора узнать, зачем в ней каждое слово.
Концерт начинается с первой ноты: дирижёр поднимает палочку, и оркестр вступает с первого такта. У программы тоже есть место, откуда начинается выполнение, — точка входа. В Java это метод main. При запуске JVM ищет в классе метод с этим именем и вызывает его.
public class Main {
public static void main(String[] args) {
System.out.println("Start"); // Start
}
}Здесь картинка с концертом неточна. Концерт начинается с первой страницы партитуры, а программа — не с первой строки файла, а с метода main, где бы он ни стоял в классе.
Слово за словом
Заголовок метода main состоит из пяти частей:
public— метод открыт для вызова снаружи класса. Так его и вызывает JVM при запуске.static— метод принадлежит самому классу, и для его вызова не нужен объект. Это слово мы разберём ниже отдельно.void— метод ничего не возвращает: он выполняет свои инструкции и заканчивается, не отдавая результата.main— имя, по которому JVM находит точку входа. Оно пишется только строчными буквами.(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:
void main() {
IO.println("Hello, Java"); // Hello, Java
}Такой файл тоже сохраняют, например, как Main.java и запускают командой java Main.java. Компилятор сам создаёт для него класс и называет его по имени файла. IO.println печатает так же, как System.out.println.
Компактный файл вы встретите в свежих учебниках по Java. В этом курсе программы пишутся в классической форме, с классом Main: такой код работает и в Java 17 и 21, которые чаще всего стоят на работе и встречаются на собеседованиях.
Частая ошибка
Имя метода написали с заглавной буквы:
public class Main {
public static void Main(String[] args) { // ✗
System.out.println("Start");
}
}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.