<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一段很有意思的代碼!!

          共 1567字,需瀏覽 4分鐘

           ·

          2022-05-27 03:26

          來源:冰河技術(shù)?,作者冰河

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

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

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

          我們先來看一段代碼,如下所示。

          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 中運(yùn)行上面這段程序,沒錯,輸出結(jié)果如下所示。

          我是if語句的分支
          我是else語句的分支

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

          代碼分析

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

          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語句的分支");
          ????????}

          ????}
          }

          看到這里,有木有一種恍然大悟的感覺呢?

          沒錯,上述的程序在本質(zhì)上,main 方法執(zhí)行了兩次。

          為什么會是執(zhí)行了兩次呢?

          原因就在 main 方法中調(diào)用 print() 方法時,傳遞的參數(shù)上。

          所以,我們先來看看調(diào)用 print() 方法傳遞的參數(shù),如下所示。

          args?==?null?||?(new?Test()?{
          ????{
          ????????Test.main((String[])null);
          ????}
          }).equals((Object)null)

          可以看到,調(diào)用 print() 方法傳遞的參數(shù)中,args == null?為 true,執(zhí)行 print() 方法的 if 語句,這點(diǎn)不難理解。

          接下來就是要重點(diǎn)理解下面的代碼片段了。

          (new?Test()?{
          ????{
          ????????Test.main((String[])null);
          ????}
          }).equals((Object)null)

          這段代碼是什么意思呢?

          首先,這段代碼再次創(chuàng)建了一個 Test 類的對象實(shí)例,并在代碼塊中調(diào)用了 Test 類的 main() 方法。由于 Test 類的對象實(shí)例不為空,所以,equals((Object)null)?會返回 false。

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

          - EOF -

          瀏覽 22
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕第45页 | 人人天天夜夜 | 污视频网站在线观看国产 | 豆花视频国产在线 | 亚洲精品国产AV婷婷在 |