if语句执行完else语句是不是真的不会再执行
今天就跟大家聊聊有关if语句执行完else语句是不是真的不会再执行,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
主要从事网页设计、PC网站建设(电脑版网站建设)、wap网站建设(手机版网站建设)、响应式网站设计、程序开发、微网站、微信小程序等,凭借多年来在互联网的打拼,我们在互联网网站建设行业积累了丰富的网站设计制作、网站设计、网络营销经验,集策划、开发、设计、营销、管理等多方位专业化运作于一体,具备承接不同规模与类型的建设项目的能力。
问题分析
最近一名读者留言说,自己出去面试被面试官的一道奇葩问题问倒了,这个问题就是: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语句的逻辑。
看完上述内容,你们对if语句执行完else语句是不是真的不会再执行有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。
当前名称:if语句执行完else语句是不是真的不会再执行
本文路径:http://myzitong.com/article/ipspjg.html