【Java】面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?
写在前面
最近跳槽找工作的朋友确实不少,遇到的面试题也是千奇百怪,这不,一名读者面试时,被面试官问到了一个直击灵魂的问题: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语句真的不会再执行吗?相关推荐
- 面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?
写在前面 最近跳槽找工作的朋友确实不少,遇到的面试题也是千奇百怪,这不,一名读者面试时,被面试官问到了一个直击灵魂的问题:if 语句执行完else语句真的不会再执行吗?这个奇葩的问题把这名读者问倒了! ...
- 面试官灵魂拷问:为什么代码规范要求 SQL 语句不要过多的 join?
送分题 面试官:有操作过Linux吗? 我:有的呀 面试官:我想查看内存的使用情况该用什么命令 我:free 或者 top 面试官:那你说一下用free命令都可以看到啥信息 我:那,如下图所示 可以看 ...
- 面试官灵魂拷问:为什么 SQL 语句不要过多的 join?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 来源:r6d.c ...
- 大企业中,Java面试官最爱问的问题集锦(2)
Java编程语言是一种简单.面向对象.分布式.解释型.健壮安全.与系统无关.可移植.高性能.多线程和动态的语言.如今Java已经广泛应用于各个领域的编程开发. java 面试官:volatile的两点 ...
- 从Java面试官的角度,如何快速判断程序员的能力
临近年关,今年面试跳槽的人特别多,关注我的朋友都知道我不轻易做分享,因为这没有标准答案,看法也因人而异.但我发现有些面试问题还挺普遍的,今天就说说我做面试官这几年的经验,从面试官的角度去看面试,希望对 ...
- 大企业中,Java面试官最爱问的问题集锦
Java编程语言是一种简单.面向对象.分布式.解释型.健壮安全.与系统无关.可移植.高性能.多线程和动态的语言.如今Java已经广泛应用于各个领域的编程开发. Java 面试官:说的还可以,那你知道v ...
- 如果你是一个Java面试官,你会问哪些问题?
作为一名年近40的大龄IT从业人员,在上市公司当经理兼创业公司当总监,从面试上来说也算是阅人无数了吧,所以谈谈个人作为Java面试官,我一般会问的一些问题,希望对你有所收获. 一.请自我介绍 我一般面 ...
- Java面试系列之并发编程专题-Java线程池灵魂拷问
金三银四跳槽季即将来临,想必有些猿友已经蠢蠢欲动在做相关的准备了!在接下来的日子里,笔者将坚持写作.分享Java工程师在面试求职期间的方方面面,包括简历制作.面试场景复现.面试题解答.谈薪技巧 以及 ...
- Java面试官:给Java面试者的八点建议
作者:hsm_computer www.cnblogs.com/JavaArchitect/p/10011253.html 在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标 ...
最新文章
- 学习IT技术你需要的是书?视频教程?还是老师?
- 安装 Fedora 21 工作站后要做的10件事情
- spark比java快吗_为什么我的Spark DataFrame比RDD慢得多?
- Vue中的 ref 和 $refs
- python手机端秒杀_python实现淘宝秒杀脚本
- ASP实现数据库事务处理的方法
- python3.5安装pip_win10上python3.5.2第三方库安装(运用pip)
- java线程——信号量(Semaphore)+障栅(CyclicBarrier)
- Java数据库篇8——索引、视图、存储过程、触发器
- KITTI数据集的使用——雷达与相机的数据融合
- hashmap是单向链表吗_HashMap源码大剖析
- 【题解】ZJOI2017仙人掌
- 判断进程是否正在运行
- 【关于我】一个专注于嵌入式物联网架构设计的攻城狮
- TextView常用属性
- ST-Link驱动的下载、安装、配置,以及ST-Link固件的升级
- 一行代码一道题:求2的幂次方
- 权限维持:DSRM 域控权限维持
- 【python】python读取命令行选项参数
- 基于uniapp与node.js实现的微信授权登录
热门文章
- 【基础算法】算法,从排序学起(一)
- 关于学习Python的一点学习总结(10->设置字符串格式)
- Bzoj1185最小矩阵覆盖[旋转卡壳+凸包+处理[-0]情况]
- matlab模型参数不匹配怎么办,修改Simulink模型后出现初始状态大小不匹配的错误...
- 模板 - 计算几何相关公式大全
- Oracle update 多表关联更新
- html引入css webpack_webpack4(一):基本配置、html和css的处理
- python迭代器和生成器_python中迭代器和生成器。
- 在小程序中实现 Mixins 方案
- 创建function实现hive表结果导出到mysql