Первый урок — или трюк, в зависимости от того, как вы смотрите на него — этого вопроса является то, что только один main
метод не является особенным, независимо от того, сколько main
методы присутствуют. Особенным является тот, который принимает форму
public static void main(/* multiple arguments */) { ... }
В прошлом, аргумент должен был быть String[] args
, но для последних версий, VAR-арг также является приемлемым (например, String... args
). JLS 12.1.4
Теперь, когда мы знаем, с каким методом начать, мы видим, что первая строка проверяет значение a
. Мы видим, что он инициализирован 1, поэтому мы можем игнорировать линию a==2
. Затем на следующей строке мы переходим к аргументу no-main
.
В no-arg main
, a
получает значение 2. Следующий урок состоит в том, что локальные переменные метода могут скрывать переменные класса. Объявляется новый a
, и он имеет приоритет внутри метода, но только до тех пор, пока этот метод работает. Это массив строк размером десять, но установлен только первый (до «Hi2»). В этом методе есть еще один урок: этот код написан, чтобы заставить вас думать, что строка-arg main
вызывается следующим, но это не так, потому что мы не создали объект, а это не static
. Вместо этого мы возвращаемся к main(String[] args)
.
На этот раз помню, мы поставили его в не-Arg main
и a
является static
поэтому изменение палочками вокруг — поэтому мы выводим первый аргумент, «Hi2.» Затем мы установили a
в 3, поэтому предстоящий тест a==1
не удался. В следующей строке мы выводим «HI1» в первый раз, и создать новый экземпляр PlayingWithMain
, который я предполагаю, это класс, что весь фрагмент кода живет.
С a
является static
, его значение остается 3 даже для нового объекта. Однако, поскольку объект вызывает main("Hi3")
, мы не переходим к static
версии main
; Вместо этого мы переходим к строке-arg main
. Этот метод просто удаляет вход обратно обратно вызывающему, где он сразу же распечатывается.
Это делает для строки-массива-arg main
, поэтому мы возвращаемся к методу, который его назвал, no-arg main
. Это также закончено, поэтому мы снова вернемся к версии main(String[] args)
, которую вызвала JVM.Помните, мы только что закончили линию
if (a==1) { main(); }
поэтому мы снова перейдем к печати «Hi1». Наконец, мы повторяем последнюю строку, которая создает новый новый объект PlayingWithMain
и печатает «Hi3» в последний раз.
Просто проследите исполнение с ручкой и бумагой. (Этот код ужасен кстати.) – Mat
Или вы можете отлаживать программу, используя любую IDE, такую как eclipse, netbeans и т. Д. Это поможет вам понять более легко. –