当前位置: 首页 > 科技观察

一段非常有趣的代码!!!你明白吗?

时间:2023-03-13 15:00:49 科技观察

大家好,我是冰河~~今天给大家分享一段很有意思的代码。这段代码在执行一个方法的时候,不仅会执行方法的if分支,还会执行方法的else分支。太神奇了。好了,我们直接上代码。实现程序,我们先来看一段代码,如下图。publicclassTest{publicstaticvoidmain(String[]args){newTest().print(args==null||newTest(){{Test.main(null);}}.equals(null));}publicvoidprint(booleanflag){if(flag){System.out.println("Iamabranchoftheifstatement");}else{System.out.println("Iamabranchoftheelsestatement");}}}在你的IDE段程序,没错,输出如下。我是if语句的分支,我是else语句的分支,我居然同时执行了if语句和else语句。这是怎么回事?代码分析我们看一下这段代码的反编译结果,如下所示。publicclassTest{publicTest(){}publicstaticvoidmain(String[]args){(newTest()).print(args==null||(newTest(){{Test.main((String[])null);}}).equals((Object)null));}publicvoidprint(booleanflag){if(flag){System.out.println("我是if语句的一个分支");}else{System.out.println("我是else语句的分支");}}}看到这里,是不是有一种豁然开朗的感觉呢?没错,上面的程序本质上就是被main方法执行了两次。为什么要执行两次?原因在于main方法中调用print()方法时传递的参数。那么,我们先来看看调用print()方法时传递的参数,如下所示。args==null||(newTest(){{Test.main((String[])null);}}).equals((Object)null)可以看到在调用print()方法传递的参数中,args==null为真,执行print()方法的if语句,这个不难理解。下一步是重点理解以下代码片段。(newTest(){{Test.main((String[])null);}}).equals((Object)null)这段代码是什么意思?首先,这段代码再次创建了Test类的对象Instance,并在代码块中调用了Test类的main()方法。此时,由于Test类的对象实例不为空,equals((Object)null)会返回false。此时再次执行print()方法时,传递的flag为false,执行else语句的逻辑。