一段很有意思的代码!!

C语言题库

共 1567字,需浏览 4分钟

 ·

2022-05-27 03:26

来源:冰河技术 ,作者冰河

本文给大家分享一段很有意思的代码,这段代码在执行方法时,不但会执行方法的 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 语句的逻辑。

- EOF -

浏览 7
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报