2012-04-10 106 views
2

这里是我的代码:为什么`main`在这里被调用两次?

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

我得到以下输出:

done 
done 

有人可以请解释我这样做的原因是什么?

+1

请阅读[this](http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html)。 – mre 2012-04-10 20:14:41

回答

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中的参数,它应该是字符串 – 2012-04-10 20:19:57

+0

我只是因静态块内main方法中存在null参数而感到困惑,请告诉我会说它会产生任何问题,因为主要方法期望一个字符串类型作为参数 – 2012-04-10 20:28:10

+0

@saurabhRai:'main'方法需要'String ** **数组**,而不是'String'。另外'null'不是很正确,因为'main'方法总是由JVM提供参数数组 - 如果没有参数,这个数组是空的,但不是'null'。 – 2012-04-10 20:30:12

6

的原因是main被调用两次:

  1. 明确,从static initialization block一旦类被加载。
  2. 隐含地,一旦程序启动就立即进入程序。

如何解决这个问题?要么不明确地调用它,要么重命名它,以便它不会被自动调用。

1

当第一次加载类时,会调用类的静态块。这是第一次完成。第二个是因为你正在运行程序,然后调用main方法。

+0

无论你告诉我,我知道,但问题是,我们传递null作为静态主要方法中的参数,它应该有一些字符串 – 2012-04-10 20:17:29

+0

由于您没有使用传递给main的参数,它并不重要,你是什么传递给主要方法。它只会被调用。 – 2012-04-10 20:25:27

+0

谢谢,最后你提供了我正在寻找的解决方案 – 2012-04-10 20:31:53

2

由于

  • 当类Test在JVM(它是一种静态构造的)
  • 而执行开始时,main方法被称为内部加载的static { ... }部分被调用。
1

主要是通过在加载罐虚拟机自动调用,所以这是第一个“完成”,正常的切入点Java程序

012。

第二个'完成'是因为您在静态类初始化程序中显式调用它而编写的。一旦虚拟机类加载器加载类,就会调用添加到“Test”类中​​的“静态”部分。

应该从静态初始化程序甚至在入口点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"); 
    } 
} 

上面的代码是它应该是。

相关问题