网站首页 > 基础教程 正文
从计算机底层原理来说,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语句的逻辑。
是不是很神奇呢?所以,从现在开始,你要转变你的观念,这告诉我们:任何权威都不是绝对的,你要做的就是要敢于挑战权威,指出他们不对的地方!
- 上一篇: C++——if-else 语句
- 下一篇: Java中的if-else语句(笔记)
猜你喜欢
- 2024-11-20 一文搞懂Golang条件判断:if-else语句详解
- 2024-11-20 无需If-Else语句,状态模式即可编写干净可维护的代码
- 2024-11-20 答应我,别再if/else走天下了可以吗
- 2024-11-20 如何对SpringBoot中的IF-ELSE语句进行优化?
- 2024-11-20 道哥说编程--Java流程控制语句if--else详解
- 2024-11-20 if-elif-else,三目运算符,while条件循环,for迭代循环
- 2024-11-20 设计模式:策略模式避免多重分支语句(ifelse)
- 2024-11-20 Excel VBA流程图解之IF语句,多层IF嵌套,其实很简单
- 2024-11-20 4.2 练习编写简单的if语句和else语句
- 2024-11-20 C/C++编程笔记:if—else语句块,有个细节需要注意
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- deletesql (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)