方法過載中有趣的問題

2021-09-08 13:03:21 字數 1099 閱讀 1130

看到乙個比較有意思的問題

public class invoketest 

// method_1

public static void invoke(object obj)

// method_2

public static void invoke(int arr)

// method_3

public static void invoke(int num)

}

其執行結果是什麼呢?

我的第一反應是 不能通過編譯吧,我之前在工作中就遇到過類似的問題,是使用invoke((object)null) 或invoke((int)null)來確定詳細呼叫哪個方法的.

然而實際情況是不但可以通過編譯,並且呼叫的還是method_2

從執行結果來看jvm應該是會從子類開始匹配的,先找到method_2,所以就直接呼叫了,為此我進行了例如以下的證明

1.在測試類中再新增乙個方法

// method_4

public static void invoke(string str)

結果不能通過編譯.

2.新增測試類:

public class test 

public static void invoke(object obj)

public static void invoke(object1 arr)

public static void invoke(object2 arr)

public static void invoke(ojbect3 str)

}class object1 extends object{}

class object2 extends object1{};

class ojbect3 extends object2{};

可以正確執行方法,呼叫的是object3的方法.

結論:當使用null作為引數呼叫方法時,jvm會從底向上匹配的方式匹配方法,找到就執行.當不能正確匹配時,會報編譯錯誤,須要強轉null為指定的型別才幹正確呼叫.

python 中有趣的庫tqdm

tqdm 是 python 進度條庫,可以在 python 長迴圈中新增乙個進度提示資訊用法 tqdm iterator 方法1 import time from tqdm import tqdm for i in tqdm range 100 time.sleep 0.01 方法2 import ...

語言工程中有趣的事情

如果您閱讀此部落格,您將知道我堅信語言的力量。因此,我當然有很大的偏見,但是我感覺語言工程社群正在增長,並且越來越有趣的東西正在湧現。為此,我認為通過檢視社群中正在發生的事情並列出一些我發現有趣的事情來結束這一年是個好主意。一定 要在聖誕節前 ftomasse samharwell antlr gu...

有趣的過載(C 標準庫)

的由來 原來如此 include const char endl n class console console operator char c console operator const char s console operator double d console cout intmain ...