一段很有意思的代码!!

程序员的成长之路

共 3352字,需浏览 7分钟

 · 2022-06-21

程序员的成长之路
互联网/程序员/技术/资料共享 
关注


阅读本文大概需要 2.8 分钟。

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

<END>

推荐阅读:

大一女生废话编程爆火!懂不懂编程的看完都拴Q了

为什么不建议使用ON DUPLICATE KEY UPDATE?

互联网初中高级大厂面试题(9个G)

内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!

戳阅读原文领取!                                  朕已阅 

浏览 2
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报