Java 方法重載是靜態(tài)綁定 --基礎(chǔ)而容易忽視的知識(shí)

今天有人遇到這樣的問題:在重構(gòu)一個(gè)Util jar時(shí)匕积,發(fā)現(xiàn)有個(gè)靜態(tài)方法設(shè)計(jì)的還不夠抽象; 參數(shù)用更高層次的接口會(huì)比較好, 比如 A extend B泵三,那么使用B 來代替 A; 因?yàn)槭褂?Super Type 作為參數(shù),從而認(rèn)為此前調(diào)用該方法的地方也不需要重寫; 本地將重新構(gòu)建的Util jar放到本地eclipse項(xiàng)目中測試一下, 測試結(jié)果ok! 但是將Util.jar放到運(yùn)行環(huán)境下, 就發(fā)生了NoSuchMethod 異常;
問題原因:方法參數(shù)的重載方法是靜態(tài)綁定的,在編譯時(shí)就確定了畜普, 根據(jù)申明的Type去判斷選擇合適的方法,而不是實(shí)際的Object群叶;

下面舉個(gè)簡單的例子;
設(shè)計(jì)一個(gè)簡單的工具吃挑,判斷集合中是否元素存在;

public class Util { 
    public static boolean hasData(List<?> l) {
        if(l != null && l.size() > 0) {
            return true;
        }
        return false;
    }
}

在另一個(gè)類中調(diào)用測試;

public class Test {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        System.out.println(Util.hasData(list));
    }
}

后來為了更廣泛的使用, 我們將List 修改Collection;

public class Util { 
    public static boolean hasData(Collection<?> l) {
        if(l != null && l.size() > 0) {
            return true;
        }
        return false;
    }
}

此時(shí), 如果我們在不重新編譯Test.class的情況下, 運(yùn)行class文件就會(huì)拋錯(cuò)钝荡;
打印出字節(jié)碼就可以發(fā)現(xiàn)的問題所在; 第12行的調(diào)用參數(shù); 那么在運(yùn)行,系統(tǒng)拋出NoSuchMethod hasData:(Ljava/util/List;) 也就一點(diǎn)都不意外了;

public static void main(java.lang.String[]);
    Code:
       0: new           #16                 // class java/util/ArrayList
       3: dup
       4: invokespecial #18                 // Method java/util/ArrayList."<init>":()V
       7: astore_1
       8: getstatic     #19                 // Field java/lang/System.out:Ljava/io/PrintStream;
      11: aload_1
      12: invokestatic  #25                 // Method simpletest/Util.hasData:(Ljava/util/List;)Z
      18: return

  • 靜態(tài)綁定是喪失了動(dòng)態(tài)特性為代價(jià)可以提供更佳的性能(編譯時(shí)確定)舶衬;它與動(dòng)態(tài)綁定的區(qū)別埠通,一言以蔽之就是一個(gè)根據(jù)Type判斷,而另一個(gè)根據(jù)Object判斷逛犹;
  • 除了上面的例子端辱,即方法的重載是靜態(tài)綁定以外;此外對(duì)Object上調(diào)用static method虽画, private method & final method 這些不能override的方法舞蔽,都是靜態(tài)綁定(invokestatic);
  • 根據(jù)上面兩點(diǎn),只有Type 和 Sub Type的其他方法, 只有在方法參數(shù)完全一致(對(duì)于泛型而言狸捕,即使是類型擦除喷鸽,Java也要求泛型參數(shù)的類型必須一直才可以重載众雷,可以自己試著自己在IDE里測試一下)的情況下才有存在Override灸拍;這也是開發(fā)者容易犯的一個(gè)錯(cuò);
  • 在自動(dòng)化發(fā)布的過程中, 如果上層的Jar修改了, 下層的Jar即使不需要修改砾省,也需要重新編譯鸡岗。這里就是一個(gè)例子;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末编兄,一起剝皮案震驚了整個(gè)濱河市轩性,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狠鸳,老刑警劉巖揣苏,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異件舵,居然都是意外死亡卸察,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門铅祸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坑质,“玉大人,你說我怎么就攤上這事临梗∥卸螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵盟庞,是天一觀的道長吃沪。 經(jīng)常有香客問我,道長什猖,這世上最難降的妖魔是什么票彪? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任萎津,我火速辦了婚禮,結(jié)果婚禮上抹镊,老公的妹妹穿的比我還像新娘锉屈。我一直安慰自己,他們只是感情好垮耳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布颈渊。 她就那樣靜靜地躺著,像睡著了一般终佛。 火紅的嫁衣襯著肌膚如雪俊嗽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天铃彰,我揣著相機(jī)與錄音绍豁,去河邊找鬼。 笑死牙捉,一個(gè)胖子當(dāng)著我的面吹牛竹揍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邪铲,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼芬位,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了带到?” 一聲冷哼從身側(cè)響起昧碉,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揽惹,沒想到半個(gè)月后被饿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搪搏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年狭握,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慕嚷。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哥牍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喝检,到底是詐尸還是另有隱情嗅辣,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布挠说,位于F島的核電站澡谭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛙奖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一潘酗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雁仲,春花似錦仔夺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吹艇,卻和暖如春惰蜜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背受神。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工抛猖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鼻听。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓财著,卻偏偏與公主長得像,于是被迫代替她去往敵國和親精算。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓢宦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容