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>

        一段很有意思的代碼??!

        共 1567字,需瀏覽 4分鐘

         ·

        2022-05-26 17:58


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

        本文給大家分享一段很有意思的代碼,這段代碼在執(zhí)行方法時(shí),不但會(huì)執(zhí)行方法的 if 分支,也會(huì)執(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)行上面這段程序,沒錯(cuò),輸出結(jié)果如下所示。

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

        what??竟然真的同時(shí)執(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語句的分支");
        ????????}

        ????}
        }

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

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

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

        原因就在 main 方法中調(diào)用 print() 方法時(shí),傳遞的參數(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)建了一個(gè) Test 類的對象實(shí)例,并在代碼塊中調(diào)用了 Test 類的 main() 方法。由于 Test 類的對象實(shí)例不為空,所以,equals((Object)null)?會(huì)返回 false。

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

        - EOF -

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        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>
            国产α片| 国产精品久久久久久9999 | 少妇高潮一区二区三区69 | 国产性在线观看 | 欧美精品无码成人网站 | 亚洲无码精品一区二区 | 欧美肏毴视频 | 丁香五月婷婷在线视频 | 日本无码在线播放 | 水蜜桃视频网 |