写在前面

最近跳槽找工作的朋友确实不少,遇到的面试题也是千奇百怪,这不,一名读者面试时,被面试官问到了一个直击灵魂的问题: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语句的逻辑。

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

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

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

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

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

  2. 面试官灵魂拷问:为什么代码规范要求 SQL 语句不要过多的 join?

    送分题 面试官:有操作过Linux吗? 我:有的呀 面试官:我想查看内存的使用情况该用什么命令 我:free 或者 top 面试官:那你说一下用free命令都可以看到啥信息 我:那,如下图所示 可以看 ...

  3. 面试官灵魂拷问:为什么 SQL 语句不要过多的 join?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 来源:r6d.c ...

  4. 大企业中,Java面试官最爱问的问题集锦(2)

    Java编程语言是一种简单.面向对象.分布式.解释型.健壮安全.与系统无关.可移植.高性能.多线程和动态的语言.如今Java已经广泛应用于各个领域的编程开发. java 面试官:volatile的两点 ...

  5. 从Java面试官的角度,如何快速判断程序员的能力

    临近年关,今年面试跳槽的人特别多,关注我的朋友都知道我不轻易做分享,因为这没有标准答案,看法也因人而异.但我发现有些面试问题还挺普遍的,今天就说说我做面试官这几年的经验,从面试官的角度去看面试,希望对 ...

  6. 大企业中,Java面试官最爱问的问题集锦

    Java编程语言是一种简单.面向对象.分布式.解释型.健壮安全.与系统无关.可移植.高性能.多线程和动态的语言.如今Java已经广泛应用于各个领域的编程开发. Java 面试官:说的还可以,那你知道v ...

  7. 如果你是一个Java面试官,你会问哪些问题?

    作为一名年近40的大龄IT从业人员,在上市公司当经理兼创业公司当总监,从面试上来说也算是阅人无数了吧,所以谈谈个人作为Java面试官,我一般会问的一些问题,希望对你有所收获. 一.请自我介绍 我一般面 ...

  8. Java面试系列之并发编程专题-Java线程池灵魂拷问

    金三银四跳槽季即将来临,想必有些猿友已经蠢蠢欲动在做相关的准备了!在接下来的日子里,笔者将坚持写作.分享Java工程师在面试求职期间的方方面面,包括简历制作.面试场景复现.面试题解答.谈薪技巧 以及 ...

  9. Java面试官:给Java面试者的八点建议

    作者:hsm_computer www.cnblogs.com/JavaArchitect/p/10011253.html 在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标 ...

最新文章

  1. 学习IT技术你需要的是书?视频教程?还是老师?
  2. 安装 Fedora 21 工作站后要做的10件事情
  3. spark比java快吗_为什么我的Spark DataFrame比RDD慢得多?
  4. Vue中的 ref 和 $refs
  5. python手机端秒杀_python实现淘宝秒杀脚本
  6. ASP实现数据库事务处理的方法
  7. python3.5安装pip_win10上python3.5.2第三方库安装(运用pip)
  8. java线程——信号量(Semaphore)+障栅(CyclicBarrier)
  9. Java数据库篇8——索引、视图、存储过程、触发器
  10. KITTI数据集的使用——雷达与相机的数据融合
  11. hashmap是单向链表吗_HashMap源码大剖析
  12. 【题解】ZJOI2017仙人掌
  13. 判断进程是否正在运行
  14. 【关于我】一个专注于嵌入式物联网架构设计的攻城狮
  15. TextView常用属性
  16. ST-Link驱动的下载、安装、配置,以及ST-Link固件的升级
  17. 一行代码一道题:求2的幂次方
  18. 权限维持:DSRM 域控权限维持
  19. 【python】python读取命令行选项参数
  20. 基于uniapp与node.js实现的微信授权登录

热门文章

  1. 【基础算法】算法,从排序学起(一)
  2. 关于学习Python的一点学习总结(10->设置字符串格式)
  3. Bzoj1185最小矩阵覆盖[旋转卡壳+凸包+处理[-0]情况]
  4. matlab模型参数不匹配怎么办,修改Simulink模型后出现初始状态大小不匹配的错误...
  5. 模板 - 计算几何相关公式大全
  6. Oracle update 多表关联更新
  7. html引入css webpack_webpack4(一):基本配置、html和css的处理
  8. python迭代器和生成器_python中迭代器和生成器。
  9. 在小程序中实现 Mixins 方案
  10. 创建function实现hive表结果导出到mysql