自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一段很有意思的代碼!??!你看懂了嗎?

開(kāi)發(fā) 前端
今天,給大家分享一段很有意思的代碼,這段代碼在執(zhí)行方法時(shí),不但會(huì)執(zhí)行方法的 if 分支,也會(huì)執(zhí)行方法的 else 分支,就是這么神奇。

[[431856]]

大家好,我是冰河~~

今天,給大家分享一段很有意思的代碼,這段代碼在執(zhí)行方法時(shí),不但會(huì)執(zhí)行方法的 if 分支,也會(huì)執(zhí)行方法的 else 分支,就是這么神奇。

好了,我們直接上代碼吧。

實(shí)現(xiàn)程序

我們先來(lái)看一段代碼,如下所示。

  1. public class Test { 
  2.  
  3.     public static void main(String[] args) { 
  4.         new Test().print(args==null || new Test() {{Test.main(null);}}.equals(null)); 
  5.     } 
  6.  
  7.     public void print(boolean flag){ 
  8.         if(flag){ 
  9.             System.out.println("我是if語(yǔ)句的分支"); 
  10.         }else
  11.             System.out.println("我是else語(yǔ)句的分支"); 
  12.         } 
  13.     } 

在你的IDE中運(yùn)行下這段程序,沒(méi)錯(cuò),輸出結(jié)果如下所示。

  1. 我是if語(yǔ)句的分支 
  2. 我是else語(yǔ)句的分支 

我去,竟然真的同時(shí)執(zhí)行了if語(yǔ)句和else語(yǔ)句,這是怎么回事呢?

代碼分析

我們來(lái)看這段代碼反編譯后的結(jié)果,如下所示。

  1. public class Test { 
  2.     public Test() { 
  3.     } 
  4.  
  5.     public static void main(String[] args) { 
  6.         (new Test()).print(args == null || (new Test() { 
  7.             { 
  8.                 Test.main((String[])null); 
  9.             } 
  10.         }).equals((Object)null)); 
  11.     } 
  12.  
  13.     public void print(boolean flag) { 
  14.         if (flag) { 
  15.             System.out.println("我是if語(yǔ)句的分支"); 
  16.         } else { 
  17.             System.out.println("我是else語(yǔ)句的分支"); 
  18.         } 
  19.  
  20.     } 

看到這里,有木有一種恍然大悟的感覺(jué)呢?沒(méi)錯(cuò),上述的程序在本質(zhì)上,main方法執(zhí)行了兩次。為什么會(huì)是執(zhí)行了兩次呢?原因就在main方法中調(diào)用print()方法時(shí),傳遞的參數(shù)上。所以,我們先來(lái)看看調(diào)用print()方法傳遞的參數(shù),如下所示。

  1. args == null || (new Test() { 
  2.     { 
  3.         Test.main((String[])null); 
  4.     } 
  5. }).equals((Object)null

可以看到,調(diào)用print()方法傳遞的參數(shù)中,args == null為true,執(zhí)行print()方法的if語(yǔ)句,這點(diǎn)不難理解。接下來(lái)就是要重點(diǎn)理解下面的代碼片段了。

  1. (new Test() { 
  2.     { 
  3.         Test.main((String[])null); 
  4.     } 
  5. }).equals((Object)null

這段代碼是什么意思呢?首先,這段代碼再次創(chuàng)建了一個(gè)Test類的對(duì)象實(shí)例,并在代碼塊中調(diào)用了Test類的main()方法。

此時(shí),由于Test類的對(duì)象實(shí)例不為空,所以,equals((Object)null)會(huì)返回false。

 

此時(shí),再次執(zhí)行print()方法時(shí),傳遞的flag為false,執(zhí)行了else語(yǔ)句的邏輯。

 

責(zé)任編輯:武曉燕 來(lái)源: 冰河技術(shù)
相關(guān)推薦

2010-04-09 11:24:59

Oracle 排序

2015-03-12 10:46:30

代碼代碼犯罪

2024-08-12 12:30:27

2024-03-18 08:14:07

SpringDAOAppConfig

2024-04-29 09:25:19

2015-01-05 10:13:37

2022-11-28 07:10:57

2020-12-12 13:50:16

云開(kāi)發(fā)

2021-01-27 13:54:05

開(kāi)發(fā)云原生工具

2018-06-24 16:39:28

Tomcat異常線程

2021-03-25 06:12:55

SVG 濾鏡CSS

2021-04-26 10:30:43

USB4設(shè)備Thunderbolt

2017-12-15 10:50:40

Kotlin語(yǔ)法糖程序員

2023-06-27 07:09:39

2022-06-28 08:42:03

磁盤(pán)kafka高性能

2022-06-21 12:27:12

JavaScript前端

2022-06-15 07:21:47

鼠標(biāo)指針交互效果CSS

2022-08-15 22:34:47

Overflow方向裁切

2022-07-11 13:09:26

mmapLinux

2024-09-29 08:47:55

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)