程序员的成长之路

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

关注

阅读本文大概需要 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......等技术栈!
⬇戳阅读原文领取!                                  朕已阅

一段很有意思的代码!!相关推荐

  1. 一段很有意思小代码:视频中提取心率

    通过功率谱的方法估计视频中人脸的心率 原理: 由麻省理工学院多媒体实验室提出的,基于光电容积脉搏波描记( Photoplethysmography,PPG)原理,结合独立成分分析,利用人面部视频测量出 ...

  2. 【Python教程】Jupyter Notebook把一段很长的代码分成多行的解决办法

    Jupyter Notebook把一段很长的代码分成多行的解决办法 使用Jupyter Notebook时经常会遇到一段代码很长 导致代码块向右边延伸了很多 感觉 很! 不! 方! 便! 所以就想把这 ...

  3. 我有一段很厉害的代码,不外传的那种

    文 | 郭忠明@知乎 最近在知乎上看到一个问题,叫做"程序员有没有很厉害.不外传的代码". ​ 好像在这个遍地都是开源项目的时代,啥代码都藏不住. 但其实,是有的,而且有不少! 很 ...

  4. 当程序员说“这代码写的可真烂”,他们的意思是“这烂代码不是我写的”。而当他们说这段代码有些“小问题”时,很可能这代码是他们自己写的...

    英文原文:What Programmers Say vs. What They Mean 你是否听到过同事说"这段代码不言自明"?你的同事的这句话的实际意思是这段代码不需要写注释. ...

  5. 一个很有意思的问题: 揭示了计算机程序问题的一般处理思路

    2019独角兽企业重金招聘Python工程师标准>>> 一个很有意思的问题: 揭示了计算机程序问题的一般处理思路 === 问题标题: 如何统计汉字的字数? 问题内容: 我想统计: & ...

  6. 你应该知道这些有意思的代码

    Kyle McCormick 在 StackExchange 上发起了一个叫做 Tweetable Mathematical Art 的比赛,参赛者需要用三条推这么长的代码来生成一张图片.具体地说,参 ...

  7. 为什么我们很难看到代码 5 分钟前的样子?

    [CSDN 编者按]呵,对一名资深的 CV 工程师而言,想看五分钟之前的代码,撤销是不可能撤销的,顶多是 Ctrl-A 之后 Backspace,再重新 CV-- 作者 | Austin Z. Hen ...

  8. 16位代码段与32位代码段的区别

    16位代码段与32位代码段的区别: 16位代码段与32位代码段的区别如下: 16位代码段最长只能为64k,段内偏移量为16位,默认的指令地址及操作地址为16位:  32位代码段最长可以4G,段内偏移量 ...

  9. 特权级——保护模式的特权级检查 DPL,RPL,CPL, 一致代码段,非一致代码段

    特权级是保护模式下一个重要的概念,CPL,RPL和DPL是其中的核心概念,查阅资料无数,总结如下. 一.CPL.RPL.DPL简单解释     CPL是当前进程的权限级别(Current Privil ...

  10. CPL DPL RPL的区别 一致性代码段和非一致性代码段

    概述:在谈论保护模式编程的时候,一直会有这样的困惑:为什么除了CPL和DPL还有RPL?什么时候高特权级不能访问低特权级?什么时候低特权级不能访问高特权级?一致性代码和非一致性代码有什么区别?等等这些 ...

最新文章

  1. 吴恩达机器学习笔记7-数据绘制
  2. 透過 OpenNI 建立 Kinect 3D Point Cloud
  3. C程序中变量存放方式介绍
  4. 字符串数组 和 字符串指针 的区别
  5. 灵魂拷问,SQL 查询语句先执行 SELECT吗?
  6. angular6--创建项目
  7. 电脑脱机状态怎么解除_win7系统如何解除脱机工作 win7系统解除脱机工作步骤【介绍】...
  8. Oracle 9i安装时没有找到OCS4J.properties 解决办法
  9. 【转】 jquery遍历json数组方法
  10. 服务器修改动态磁盘,如何创建动态磁盘
  11. [破解] nasca drm file -ver1.00
  12. Information Bottleneck 信息瓶颈
  13. 软件测试周刊(第32期):沙漠中藏着一口井
  14. Java游戏吉他英雄_《吉他英雄:世界巡演》游戏秘技
  15. CCF-卖菜(Python)
  16. 肩周炎的自我运动疗法
  17. Fruit 有上下限的母函数
  18. 黑马程序员————高新技术————eclipse及IDE开发工具介绍
  19. [sig14]《正当防卫3》的Clustered Shading光照技术
  20. 用Matlab编程实现图像的傅立叶变换和逆变换并显示出来

热门文章

  1. 用PS绘出真实火焰效果
  2. php对数据进行归一化处理方法,12种数据量纲化处理方式
  3. 台币 日元 没有小数位问题_SAP刘梦_新浪博客
  4. YiGo学习(一)YiGo介绍
  5. 自然语言三兄弟NLP、NLU、NLG傻傻分不清?一文搞懂它们的区别
  6. 深入浅出达梦SQL(基础篇)
  7. Vue Browserslist: caniuse-lite is outdated.
  8. 扣哒世界发布面向中小学阶段C++信奥课程体系
  9. linux下codelite使用教程,codelite 在 ubuntu linux 中的安装和使用
  10. 【Unity】Unity3D RPG游戏制作实例(一)游戏简介及文档目录整理