<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>

          一段很有意思的代碼!!

          共 3352字,需瀏覽 7分鐘

           ·

          2022-06-21 03:27

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術/資料共享 
          關注


          閱讀本文大概需要 2.8 分鐘。

          來源 | 冰河技術 作者 | 冰河
          今天,給大家分享一段很有意思的代碼,這段代碼在執(zhí)行方法時,不但會執(zhí)行方法的 if 分支,也會執(zhí)行方法的 else 分支,就是這么神奇。
          好了,我們直接上代碼吧。

          實現(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 中運行上面這段程序,沒錯,輸出結果如下所示。
          我是if語句的分支
          我是else語句的分支
          what??竟然真的同時執(zhí)行了 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 方法執(zhí)行了兩次。
          為什么會是執(zhí)行了兩次呢?
          原因就在 main 方法中調用 print() 方法時,傳遞的參數(shù)上。
          所以,我們先來看看調用 print() 方法傳遞的參數(shù),如下所示。

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

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

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

          這段代碼是什么意思呢?
          首先,這段代碼再次創(chuàng)建了一個 Test 類的對象實例,并在代碼塊中調用了 Test 類的 main() 方法。由于 Test 類的對象實例不為空,所以,equals((Object)null) 會返回 false。
          此時,再次執(zhí)行 print() 方法時,傳遞的 flag 為 false,執(zhí)行了 else 語句的邏輯。

          <END>

          推薦閱讀:

          大一女生廢話編程爆火!懂不懂編程的看完都拴Q了

          為什么不建議使用ON DUPLICATE KEY UPDATE?

          互聯(lián)網(wǎng)初中高級大廠面試題(9個G)

          內容包含Java基礎、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務、Zookeeper......等技術棧!

          ?戳閱讀原文領取!                                  朕已閱 

          瀏覽 15
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  北条麻妃在线网站 | 99视频在线观看免费视频 | 日韩操碰 | 苍井空一级婬片A片免费观看 | 久久伊人网站 |