一段很有意思的代碼!!!你看懂了嗎?
大家好,我是冰河~~
今天,給大家分享一段很有意思的代碼,這段代碼在執(zhí)行方法時,不但會執(zhí)行方法的 if 分支,也會執(zhí)行方法的 else 分支,就是這么神奇。
好了,我們直接上代碼吧。
實現程序
我們先來看一段代碼,如下所示。
- 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語句的分支
我去,竟然真的同時執(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()方法時,傳遞的參數上。所以,我們先來看看調用print()方法傳遞的參數,如下所示。
- args == null || (new Test() {
- {
- Test.main((String[])null);
- }
- }).equals((Object)null)
可以看到,調用print()方法傳遞的參數中,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語句的邏輯。