当前位置:首页 > 公众号精选 > 架构师社区
[导读]写在前面 最近跳槽找工作的朋友确实不少,遇到的面试题也是千奇百怪,这不,一名读者面试时,被面试官问到了一个直击灵魂的问题:if 语句执行完else语句真的不会再执行吗?这个奇葩的问题把这名读者问倒了! 问题分析 最近一名读者留言说,自己出去面试被面试

<section style="font-size: 16px;color: rgb(62, 62, 62);line-height: 1.6;letter-spacing: 0px;font-family: " helvetica="" neue",="" helvetica,="" "hiragino="" sans="" gb",="" "microsoft="" yahei",="" arial,="" sans-serif;"="">

写在前面

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

问题分析

最近一名读者留言说,自己出去面试被面试官的一道奇葩问题问倒了,这个问题就是: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语句,这是怎么回事呢?

代码分析

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

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语句的逻辑。

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

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼

serif;letter-spacing:="" 0.544px;white-space:="" normal;text-align:="" right;line-height:="" 2em;box-sizing:="" border-box="" !important;word-wrap:="" break-word="" !important;"="">如有收获,点个在看,诚挚感谢

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

持续引进行业高级人才 上海2022年4月18日 /美通社/ -- 近日,全球领先的自动驾驶智能环卫公司仙途智能autowise.ai 公布2022 Q1营收情况。数据显示,2022年Q1,autowise.a...

关键字: se

(全球TMT2022年4月18日讯)自动驾驶智能环卫公司仙途智能autowise.ai 公布2022 Q1营收情况。数据显示,2022年Q1,autowise.ai实现营收数千万元,在执行合同额达数亿元,创历史新高,实...

关键字: se

生于海,长于山 上海2022年4月2日 /美通社/ -- 深受世界户外爱好者及探险家青睐的挪威国宝级户外品牌海丽汉森Helly Hansen(简称HH),创立以来始终秉持专业精神,专注打造高端专业户外装备。近...

关键字: se rc

深圳新办事处2022年全速推进,快速招聘顶尖人才 苏黎世2022年3月30日 /美通社/ -- 全球性专业服务公司Synpulse今天宣布在数...

关键字: se npu

北京2022年3月29日 /美通社/ -- Analog Devices, Inc. (NASDAQ: ADI)和Gridspertise宣布携手合作提高全球智能电网的弹性和质量。Gridspertise是一家...

关键字: se 电气 智能电网

(全球TMT2022年3月29日讯)Analog Devices, Inc. 和Gridspertise宣布携手合作提高全球智能电网的弹性和质量。Gridspertise是一家为配电系统运营商(DSO)提供先...

关键字: ADI 智能电网 se

北京2022年3月24日 /美通社/ -- 3月22日,浪潮信息宣布元宇宙服务器MetaEngine全面支持NVIDIA Omniverse Enterprise,提供支撑大规模数字孪生场景的软硬件一体化解决方案OVX,...

关键字: 英伟达 se ni

(全球TMT2022年3月23日讯)中国电信股份有限公司公布,公司在《The Asset》的‘2021年ESG企业大奖’评选中,勇夺‘杰出环境、社会及管治企业金奖’。同时,执行董事、董事长兼首席执行官柯瑞文先生在此次评...

关键字: 中国电信 se

(全球TMT2022年3月2日讯)为全球领先品牌提供营销解决方案的全球性公司RTB House宣布,资深的数字广告专家Shien Zhu(祝师恩) 将加入其东京办事处,担任亚太区品牌销售副总裁。正值该公司继续...

关键字: se

新加坡2022年3月1日 /美通社/ -- 为全球领先品牌提供先进营销解决方案的全球性公司RTB House今天宣布,资深的数字广告专家Shien Zhu(祝师恩) ...

关键字: se
关闭
关闭