看看这么一段代码。就会发现,Hello World也会如此古怪。
源代码
public class HelloWorld {
public static void main(String[] args) {
if(args == null || new HelloWorld(){{HelloWorld.main(null);}}==null){
System.out.print("Hello ");
}else {
System.out.print("World");
}
}
}
这段代码打印的结果将会是Hello World..,,我们来看运行结果。
描述一下它的运行过程。也许不正确,也不想坑人,请读者自己甄别。
- JVM调用main方法;
- 进入if,检测传入的参数是否为null(无输入,传给main方法的参数为空,,记住空不是null,也不是”“,什么都没有),发现args==null 不成立,为false;
- 继续 ||(逻辑或)运算,检测new HelloWorld(){{HelloWorld.main(null);}}==null是否为true,调用HellWorld类的无参构造器,接着再调用块,块中为HelloWorld类的静态方法main(null),这时传入了一个为null的参数,进入if,检测传入的参数,会发现args==null成立,条件短路,不再继续判断条件,这时完成第一次打印”Hello “;
- 完了吗?没有,第三步只是在检测 || 右边的代码结果是否为true,当然new 的结果会是一个HelloWorld类的实例,不是null,所以结果为false, || 的结果也就为false,运行else之后的代码,打印出"World";
- 最后我们就看到了一个"神奇"的"Hello World";
总结出几点:
- 一个class中的main方法可以运行多次,声明为 public static只是为了提供给JVM调用,剩下的跟普通的方法几乎一样,也可为其重载为签名不同的main()方法;
- || 短路的逻辑或运算,当其左边的条件为true时,不再继续判断,否则继续判断右边;