一段很有意思的代碼!!
來源:冰河技術(shù)?,作者冰河
本文給大家分享一段很有意思的代碼,這段代碼在執(zhí)行方法時,不但會執(zhí)行方法的 if 分支,也會執(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)行上面這段程序,沒錯,輸出結(jié)果如下所示。
我是if語句的分支
我是else語句的分支

what??竟然真的同時執(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語句的分支");
????????}
????}
}
看到這里,有木有一種恍然大悟的感覺呢?
沒錯,上述的程序在本質(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 語句,這點(diǎn)不難理解。
接下來就是要重點(diǎn)理解下面的代碼片段了。
(new?Test()?{
????{
????????Test.main((String[])null);
????}
}).equals((Object)null)
這段代碼是什么意思呢?
首先,這段代碼再次創(chuàng)建了一個 Test 類的對象實(shí)例,并在代碼塊中調(diào)用了 Test 類的 main() 方法。由于 Test 類的對象實(shí)例不為空,所以,equals((Object)null)?會返回 false。
此時,再次執(zhí)行 print() 方法時,傳遞的 flag 為 false,執(zhí)行了 else 語句的邏輯。

- EOF -
評論
圖片
表情
