2012-04-10 6 views
2

Вот мой код:Почему `main` называется дважды здесь?

public class Test 
{ 
    static 
    { 
     main(null); 
    } 
    public static void main(String [] args) 
    { 
     System.out.println("done"); 
    } 
} 

Я получаю следующий результат:

done 
done 

Может кто-нибудь, пожалуйста, объясните мне причину этого?

+1

Пожалуйста, прочтите [это] (http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html). – mre

ответ

3

Как вы думаете, что необычно? . static блок выполняется один раз, когда класс загружается (и он должен быть загружен перед выполнением main метода Затем main метод сам выполнен

Проверить эту измененную версию:.

public class Test { 
    static { 
     main(new String[]{"[done static]"}); 
    } 

    public static void main(String[] args) { 
     System.out.println(args.length > 0 ? args[0] : "[done]"); 
    } 
} 

Он печатает :.

[done static] 
[done] 
+0

Мы передаем null как аргумент в основном методе, присутствующем в static, он должен быть строкой –

+0

Я получаю только путаницу из-за нулевого аргумента, присутствующего в основном методе внутри статического блока, пожалуйста, сообщите мне будет создаваться какая-либо проблема или нет, потому что главный метод ожидает тип String в качестве аргумента –

+0

@saurabhRai: 'main' метод ожидает' String' ** array **, а не 'String'. Также «null» не совсем корректен, потому что метод 'main' всегда снабжается массивом аргументов JVM, и если аргументов нет, этот массив пуст, но не' null'. –

6

Причина заключается в том, что main вызывается дважды:

  1. Явное, из static initialization block, как только будет загружен класс.
  2. Неявно, при вводе программы, как только начинается программа.

Как это исправить? Либо не вызывайте его явно, либо переименуйте его так, чтобы он не вызывался автоматически.

1

Статический блок класса вызывается, когда класс загружается первым. Это первое, что сделано. Второй - потому, что вы запускаете программу, а затем вызывается основной метод.

+0

независимо от того, что вы говорите мне, что я знаю, но вопрос в том, что мы передаем null в качестве аргумента в основном методе, присутствующем в static, он должен иметь некоторую строку –

+0

Поскольку вы не используете параметры, переданные в main, не имеет значения, что вы переходя к основному методу. Это будет просто вызвано. –

+0

спасибо, наконец, вы предоставляете решение, которое я ищу –

2

Поскольку

  • static { ... } часть называется, когда класс Test загружаются внутри виртуальной машины Java (это своего рода статического конструктора)
  • в то время как метод main вызывается, когда начинается выполнение.
1

основной автоматически вызывается виртуальной машиной, когда она загружает баночку Так что это первый «Done», нормальная точка входа для программы Java

012.

Второй «Готово» написан потому, что вы явно вызываете его в инициализаторе статического класса. Раздел «статические», который вы добавили в свой класс «Тест», вызывается, как только ваш класс загружается загрузчиком класса виртуальной машины.

Нужно, чтобы из статического инициализатора даже вызывалась до того, как вызывается Main Main, поскольку класс должен быть загружен до вызова точки входа.

1

Перед вызовом Test.main JVM необходимо инициализировать класс Test, запустив его статический инициализатор. Этот вызов отвечает за первый вызов main(). Как только инициализация завершена, JVM снова вызовет main(), в конечном итоге создавая вывод, который вы видите.

1

Main автоматически вызывается JVM. Нет необходимости вызывать его в статическом разделе.

public class Test 
{ 
    public static void main(String [] args) 
    { 
     System.out.println("done"); 
    } 
} 

Вышеуказанный код - это то, что должно быть.

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