最近跳槽找工做的朋友确实很多,遇到的面试题也是千奇百怪,这不,一名读者朋友面试时,被面试官问到了一个直击灵魂的问题:if 语句执行完else语句真的不会再执行吗?这个奇葩的问题把这名读者问倒了!java
最近一名读者留言说,本身出去面试被面试官的一道奇葩问题问倒了,这个问题就是:if语句执行完else语句真的不会再执行吗?这名读者确实不知道该如何回答这个问题。回去后,本身查阅了不少资料也没弄明白这个问题!面试
想必不少读者朋友遇到这种奇葩面试题时,多多少少都会以为闹心吧!不过,闹心归闹心,问题仍是要解决的。今天,咱们就一块儿来剖析下这个奇葩的面试题。编程
从计算机底层原理来讲,Java语句中的 if 指令和 else 指令分属于两个不一样的逻辑分支,在同一段代码中,只要执行了if语句就不会执行else语句。因此,这个面试题的考点并非让你从计算机底层原理的角度去分析问题。既然不能从计算机底层原理去分析问题,那咱们须要从哪里入手分析呢?微信
没错,固然是从咱们写的程序入手了!那么,问题来了,咱们本身写的程序貌似也没有出现过执行完if语句后再执行else语句的状况呀!!别急,我们继续往下看。并发
咱们先来看一段代码,以下所示。高并发
public class Test { public static void main(String[] args) { new Test().print(args==null || new Test() {{Test.main(null);}}.equals(null)); } public void print(boolean flag){ if(flag){ System.out.println("我是if语句的分支"); }else{ System.out.println("我是else语句的分支"); } } }
在你的IDE中运行下这段程序,没错,输出结果以下所示。学习
我是if语句的分支 我是else语句的分支
我去,居然真的同时执行了if语句和else语句,这是怎么回事呢?
3d
咱们来看这段代码反编译后的结果,以下所示。code
public class Test { public Test() { } public static void main(String[] args) { (new Test()).print(args == null || (new Test() { { Test.main((String[])null); } }).equals((Object)null)); } public void print(boolean flag) { if (flag) { System.out.println("我是if语句的分支"); } else { System.out.println("我是else语句的分支"); } } }
看到这里,有木有一种恍然大悟的感受呢?没错,上述的程序在本质上,main方法执行了两次。为何会是执行了两次呢?缘由就在main方法中调用print()方法时,传递的参数上。因此,咱们先来看看调用print()方法传递的参数,以下所示。对象
args == null || (new Test() { { Test.main((String[])null); } }).equals((Object)null)
能够看到,调用print()方法传递的参数中,args == null为true,执行print()方法的if语句,这点不难理解。接下来就是要重点理解下面的代码片断了。
(new Test() { { Test.main((String[])null); } }).equals((Object)null)
这段代码是什么意思呢?首先,这段代码再次建立了一个Test类的对象实例,并在代码块中调用了Test类的main()方法,此时,因为Test类的对象实例不为空,因此,equals((Object)null)会返回false。此时,再次执行print()方法时,传递的flag为false,执行了else语句的逻辑。
是否是很神奇呢?因此,从如今开始,你要转变你的观念,这告诉咱们:任何权威都不是绝对的,你要作的就是要勇于挑战权威,指出他们不对的地方!
若是以为文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发编程技术。
最后,附上并发编程须要掌握的核心技能知识图,祝你们在学习并发编程时,少走弯路。