又见"神奇"的Hello World

看看这么一段代码。就会发现,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..,,我们来看运行结果。




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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值