一段很有意思的代码!!

2d4984dc82b98a1d46dc4935ee2e57cd.png

程序员的成长之路

互联网/程序员/技术/资料共享 

关注

阅读本文大概需要 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语句的分支

03acaa2ede36e1f14c24489e7fee271b.png

what??竟然真的同时执行了 if 语句和 else 语句,这是怎么回事呢?

9be658a35180c94233b37a855d7ca18c.png

代码分析

我们来看这段代码反编译后的结果,如下所示。

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 语句的逻辑。

d3fa5a809f9b0ec633655cd25001df3d.png

<END>

推荐阅读:

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

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

互联网初中高级大厂面试题(9个G)
内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取!                                  朕已阅
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值