记得n久以前参加过IBM的一次Java笔试,里面有一道选择题,大概是给了一段代码,代码中有两个main函数,然后问这段代码执行后的结果。这道题虽然看似简单,但是当时却意外的难住了很多Java牛人,或者说不是难住,只是每个人都很肯定的说出答案,但却各不相同……Pity,答案却只有一种。这其实怪不得他们,有多少牛人能犯这种低级错误呢?即便是我这种菜鸟,也从来没冒天下之大不韪的甩出过两个"main"在class里啊。不过IBM就是IBM,注重细节到了变态的地步。我现在已经记不清那两个main函数到底是怎样一种写法,更不用说正确答案。所以今天打算实地把各种双main函数的情况都试验一下,弥补下当时心中的那块空白。
PS:测试用Java版本是1.5。为了正确的反应实验结果,我没有使用任何IDE,只通过Windows的command运行Java程序。
1、完全相同,access identifer 不同, 返回值不同
public class MainTest { public static void main(String[] args) { System.out.println("main1 starts."); } public static void main(String[] args) { System.out.println("main2 starts"); } }
编译错误:MainTest.java:7: main(java.lang.String[]) is already defined in MainTest
注意:错误发生在第二个main函数运行时(看到这里想起来,这也是那道题的一个考察点,就是错误抛出的位置)。
2、参数不同
public class MainTest { public static void main(String[] args) { System.out.println("main1 starts."); } public static void main(Integer[] args) { System.out.println("main2 starts"); } }
编译通过。
运行结果:main1 starts.
3、参数不同且没有String[] 参数型main方法
public class MainTest { public static void main(Boolean[] args) { System.out.println("main1 starts."); } public static void main(Integer[] args) { System.out.println("main2 starts"); } }
编译通过。
运行错误:Exception in thread "main" java.lang.NoSuchMethodError: main
结论:虚拟机只运行"public static void main(String[] args)"形式的main函数,且只可有一个此种形式的main函数。