大家好,我是冰河~~
今天,给大家分享一段很有意思的代码,这段代码在执行方法时,不但会执行方法的 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语句的分支
我去,竟然真的同时执行了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语句的逻辑。