1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一段很有意思的代碼!!

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

            }
        }

        看到這里,有木有一種恍然大悟的感覺呢?
        沒錯,上述的程序在本質(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 語句,這點不難理解。
        接下來就是要重點理解下面的代碼片段了。

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

        這段代碼是什么意思呢?
        首先,這段代碼再次創(chuàng)建了一個 Test 類的對象實例,并在代碼塊中調(diào)用了 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)

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

        ?戳閱讀原文領?。?/span>                                  朕已閱 

        瀏覽 15
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            五月天av激情 | 日韩精品欧美成人高清一区二区 | 殴美性生活视频 | 大雞巴弄得我好爽 | 学生妹一区二区三区 | 伊人精品在线 | 00后rapper潮水仙踪林的歌词 | 国产成人精品无码区免费福利 | 妇欲欢公爽公妇视频 | 午夜私人影院在线观看 |