从计算机底层原理来说,Java语句中的 if 指令和 else 指令分属于两个不同的逻辑分支,在同一段代码中,只要执行了if语句就不会执行else语句。所以,这个面试题的考点并不是让你从计算机底层原理的角度去分析问题。既然不能从计算机底层原理去分析问题,那我们需要从哪里入手分析呢?

没错,当然是从我们写的程序入手了!那么,问题来了,我们自己写的程序貌似也没有出现过执行完if语句后再执行else语句的情况呀!!别急,咱们继续往下看。

实现程序

我们先来看一段代码,如下所示。

publicclassTest{ publicstaticvoidmain(String[]args){ newTest().print(args==null||newTest(){{Test.main(null);}}.equals(null)); } publicvoidprint(booleanflag){ if(flag){ System.out.println("我是if语句的分支"); }else{ System.out.println("我是else语句的分支"); } } }

在你的IDE中运行下这段程序,没错,输出结果如下所示。

我是if语句的分支 我是else语句的分支

if语句执行后else if还执行吗(你敢信if语句执行完)(1)

我去,竟然真的同时执行了if语句和else语句,这是怎么回事呢?

if语句执行后else if还执行吗(你敢信if语句执行完)(2)

代码分析

我们来看这段代码反编译后的结果,如下所示。

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为true,执行print()方法的if语句,这点不难理解。接下来就是要重点理解下面的代码片段了。

(newTest(){ { Test.main((String[])null); } }).equals((Object)null)

这段代码是什么意思呢?首先,这段代码再次创建了一个Test类的对象实例,并在代码块中调用了Test类的main()方法,此时,由于Test类的对象实例不为空,所以,equals((Object)null)会返回false。此时,再次执行print()方法时,传递的flag为false,执行了else语句的逻辑。

if语句执行后else if还执行吗(你敢信if语句执行完)(3)

是不是很神奇呢?所以,从现在开始,你要转变你的观念,这告诉我们:任何权威都不是绝对的,你要做的就是要敢于挑战权威,指出他们不对的地方!

,