【Java】面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?

【Java】面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?

写在前面
最近跳槽找工作的朋友确实不少,遇到的面试题也是千奇百怪,这不,一名读者朋友面试时,被面试官问到了一个直击灵魂的问题:if 语句执行完else语7 C ^ ? x z N v句真的不会再执行吗?这个奇葩的问题把这名读者问倒了!

问题分析
最近一名读者留言说,自己出去面试被面试官的一道奇葩问u 2 L ; | P / w K题问倒了,这个问题就是:if语句执行完else语句真的不会再执行吗?这名读者确实不知道该如何回答这个问题。回去后,自己查阅了很多资料8 y p y也没弄明白这个问题!A ? w V U f V

想必很多读者朋友遇到这种奇葩面试题时,多多少少都会觉得闹心吧!不过,闹心归闹心,问题还是要解决的。今天,我们就一起来剖析下这个奇葩的面试题。

从计算m T D C机底层原理来说,4 + Jav# G 3a语句中j + 7 +的 if 指令和 else 指令分属于两个不同的逻辑分支,在同一段代码中,只要执行了if语句就不会执行else语句t p P b j v g ;。所以,这个面试题的考点并不是让你从计算机底层原理的角度去分析问题。既然不能从计算机底层原理去分析问题,那我们需要从哪里入手分l m R { } 5析呢?

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

实现程序
我们U N - S w先来看一段代码,如下所示。

public class Test {

public s` X ` Ztatiy B q # { A 2 i jc void main(String[] args)& | # 0 {
new Test().print(args==null || new Test() {{Test.mau 4 R @ 7 , & &in(n{ & & m S ) h lull);}}.equals(null));
}
public void print(boolean flag){
if(flag){
Syst( # . p X 3 0 8em.out.println("我是if语句的分支N 9 ? Q 3 ( [");
}g E n 1 [ # @ J @else{
System.out.println("我是else语句的分支");
}
}

}
在你的I^ X _ S o L n e DDE中运行下这段程序,没错,输出结果如下所示。

我是if语句的分支
我是else语句的W U % v Z p V p l分支

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

代码分析
我们来Q v 8 -看这段代码反j g o K - 8 U P Z编译后的结果,如下所示。

public class Test {

public Test() {
}
publi[ g 1c static void main(String[]m Y c $ 7 + / r args) {
(new Test(k 9 _ : =)).print(args == null || (new@ s ; K Test() {
{
Test.main((String[])null);
}
}).equals((Object)null));
}
public void print(boolean flag) {
if (flag) {
System.outx 7 1 p $ _ *.println("我是if语句的分支");
} else {
Systw O = 7 K H  pem.out.println("我是elsei 2 !  * ! f语句的分支W h z");
}
}4 N * g

}
e h x O }到这里,有木有一种恍然大悟的感觉呢?没错,上述的程序在本质上,main方法执行了两次。为什么会是执行了两次呢?原因就在main方法中调用printm f $ v r @ 9 ? 0()方法时,传递的参数上。所s o 2 U 6以,我们先来看看调用print()方法传递的参数,如下所示。

arP j q _ z % $ Egs == null_ , _ s G + j F H || (new Test() {

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

})R & r I.equals((Object)null)
可以看到,调用print()方法传递的参数中,args == null为true,执行print() U D k方法的. ^ e ; % # , 9 bif语句,这点不难理解。接下来就是要重点理解下面的代码片段了。

(new Test() {

{
Test.main((String[])nuf q n ? 8 d 0 Ell);
}

}).eq0 # L uals((Object)null)
这段代码是什么意思呢?首先,这段代码再次创 8 M & = r f 8建了一个Test类的对象实例,并在代码块中调用了Test类的main()方法,此时,由于Tes= x P St类的对象实b U 5 T例不为空,所C R , O 8 ( s ! (以,equals((Object)null)会返回falseW ! e。此时,再次执行print()方法时,传递的flag为false,执行了else语句的逻辑。

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

写在最后
如果觉得文章对你有点帮助,请微信搜索并关注「冰河技术」微信公众号,跟冰河学习高并发编程技术。

最后,附上并发编程需要掌握* ; d H d 1 L x的核心技能知识图,祝大家在学习并发编程时,少走弯路。

原文地址https://wwg $ H m -w.cnblogs.com/binghe001! 0 I & @/p/12944844.html