一段很有意思的代碼!??!你看懂了嗎?
大家好,我是冰河~~
今天,給大家分享一段很有意思的代碼,這段代碼在執(zhí)行方法時(shí),不但會(huì)執(zhí)行方法的 if 分支,也會(huì)執(zhí)行方法的 else 分支,就是這么神奇。
好了,我們直接上代碼吧。
實(shí)現(xiàn)程序
我們先來(lái)看一段代碼,如下所示。
- 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語(yǔ)句的分支");
- }else{
- System.out.println("我是else語(yǔ)句的分支");
- }
- }
- }
在你的IDE中運(yùn)行下這段程序,沒(méi)錯(cuò),輸出結(jié)果如下所示。
- 我是if語(yǔ)句的分支
- 我是else語(yǔ)句的分支
我去,竟然真的同時(shí)執(zhí)行了if語(yǔ)句和else語(yǔ)句,這是怎么回事呢?
代碼分析
我們來(lái)看這段代碼反編譯后的結(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語(yǔ)句的分支");
- } else {
- System.out.println("我是else語(yǔ)句的分支");
- }
- }
- }
看到這里,有木有一種恍然大悟的感覺(jué)呢?沒(méi)錯(cuò),上述的程序在本質(zhì)上,main方法執(zhí)行了兩次。為什么會(huì)是執(zhí)行了兩次呢?原因就在main方法中調(diào)用print()方法時(shí),傳遞的參數(shù)上。所以,我們先來(lái)看看調(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語(yǔ)句,這點(diǎn)不難理解。接下來(lái)就是要重點(diǎn)理解下面的代碼片段了。
- (new Test() {
- {
- Test.main((String[])null);
- }
- }).equals((Object)null)
這段代碼是什么意思呢?首先,這段代碼再次創(chuàng)建了一個(gè)Test類的對(duì)象實(shí)例,并在代碼塊中調(diào)用了Test類的main()方法。
此時(shí),由于Test類的對(duì)象實(shí)例不為空,所以,equals((Object)null)會(huì)返回false。
此時(shí),再次執(zhí)行print()方法時(shí),傳遞的flag為false,執(zhí)行了else語(yǔ)句的邏輯。