2012-02-26 2 views
0

Почему «Hi1» и «Hi3» отображаются дважды следующим кодом?Нужно объяснение для вывода

static int a=1; 
public static void main(String[] args) {    
    if (a==2) { System.out.println(args[0]); a = 3;} 
    if (a==1) { main(); }  
    System.out.println("Hi1"); 
    System.out.println(new PlayingWithMain().main("Hi3")); 
} 
public static void main() { 
    a = 2; 
    String[] a = new String[10]; 
    a[0] = "Hi2"; 
    main(a); 
} 
String main(String s) { 
    return s; 
} 

Я только что начал подготовку к экзамену OCPJP.

+1

Просто проследите исполнение с ручкой и бумагой. (Этот код ужасен кстати.) – Mat

+0

Или вы можете отлаживать программу, используя любую IDE, такую ​​как eclipse, netbeans и т. Д. Это поможет вам понять более легко. –

ответ

2

Первый урок — или трюк, в зависимости от того, как вы смотрите на него — этого вопроса является то, что только один 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» в последний раз.

0

main (String []) вызывает main(), который снова вызывает main (String []), если a == 1, что истинно в начале.

Эта переменная используется, чтобы сделать эту рекурсию только один раз, а не бесконечно.

Именно поэтому основной (String []) метод выполняется дважды, и поэтому вывод, записанный из этого метода, появляется дважды.

+0

Если кто-то идет по потоку, элемент управления сначала переходит к main(), так как a == 1 ecvaluates to true, а затем возвращается к главному (String [] args), и теперь значение == 2 оценивается как true, Hi2 и после этого отображаются Hi1 и Hi3. По моему мнению, выполнение кода должно закончиться здесь. Но я все еще не могу понять, почему отображаются последние Hi1 и Hi3. –

Смежные вопросы