«1. Обзор

Every program needs a place to start its execution; talking about Java programs, that’s the main method.
We’re so used to writing the main method during our code sessions, that we don’t even pay attention to its details. In this quick article, we’ll analyze this method and show some other ways of writing it.

2. Общая подпись

The most common main method template is:
public static void main(String[] args) { }

That’s the way we’ve learned it, that’s the way the IDE autocompletes the code for us. But that’s not the only form this method can assume, there are some valid variants we can use and not every developer pays attention to this fact.

Before we dive into those method signatures, let’s review the meaning of each keyword of the common signature:

  • public – access modifier, meaning global visibility
  • static – the method can be accessed straight from the class, we don’t have to instantiate an object to have a reference and use it
  • void – means that this method doesn’t return a value
  • main – the name of the method, that’s the identifier JVM looks for when executing a Java program

As for the args parameter, it represents the values received by the method. This is how we pass arguments to the program when we first start it.

The parameter args is an array of Strings. In the following example:

java CommonMainMethodSignature foo bar

мы выполняем Java-программу под названием CommonMainMethodSignature и передаем 2 аргумента: foo и bar. Доступ к этим значениям можно получить внутри основного метода как args[0] (со значением foo) и args[1] (со значением bar).

В следующем примере мы проверяем аргументы, чтобы решить, следует ли загружать тестовые или рабочие параметры:

public static void main(String[] args) {
    if (args.length > 0) {
        if (args[0].equals("test")) {
            // load test parameters
        } else if (args[0].equals("production")) {
            // load production parameters
        }
    }
}

Всегда полезно помнить, что IDE также могут передавать аргументы программе.

3. Различные способы написания метода main()

Давайте рассмотрим несколько различных способов написания метода main. Хотя они не очень распространены, они являются действительными подписями.

Обратите внимание, что ни один из них не относится к основному методу, их можно использовать с любым методом Java, но они также являются допустимой частью основного метода.

Квадратные скобки могут быть помещены рядом со строкой, как в общем шаблоне, или рядом с аргументами с обеих сторон:

public static void main(String []args) { }
public static void main(String args[]) { }

public static void main(String...args) { }

Аргументы могут быть представлены как переменные аргументы:

public strictfp static void main(String[] args) { }

Мы можем даже добавьте strictfp для метода main(), который используется для совместимости между процессорами при работе со значениями с плавающей запятой:

synchronized и final также являются допустимыми ключевыми словами для основного метода, но здесь они не будут иметь никакого эффекта.

public static void main(final String[] args) { }

С другой стороны, final можно применить к аргументам, чтобы предотвратить изменение массива:

final static synchronized strictfp void main(final String[] args) { }

Чтобы закончить эти примеры, мы также можем написать метод main со всеми вышеуказанными ключевыми словами (которые, конечно, вы, вероятно, никогда не будете использовать в практическом приложении):

4. Наличие более одного метода main()

Мы также можем определить более одного метода main внутри нашего приложения.

На самом деле, некоторые люди используют его как примитивную технику тестирования для проверки отдельных классов (хотя тестовые фреймворки, такие как JUnit, более подходят для этой деятельности).

Main-Class: mypackage.ClassWithMainMethod

Чтобы указать, какой основной метод JVM должен выполнять в качестве точки входа нашего приложения, мы используем файл MANIFEST.MF. Внутри манифеста мы можем указать основной класс:

В основном это используется при создании исполняемого файла .jar. Мы указываем, у какого класса есть основной метод для запуска выполнения, через файл манифеста, расположенный по адресу META-INF/MANIFEST.MF (в кодировке UTF-8).

5. Заключение

В этом руководстве подробно описаны основной метод и некоторые другие формы, которые он может принимать, даже те, которые не очень распространены среди большинства разработчиков.