一段很有意思的代码!!
来源 | 冰河技术
作者 | 冰河
今天,给大家分享一段很有意思的代码,这段代码在执行方法时,不但会执行方法的 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语句的分支
what??竟然真的同时执行了 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 语句的逻辑。
评论