天天看點

Java泛型程式設計與多态、重載的同與不同

泛型程式設計在某些語言中也稱之為模闆程式設計,比如c++,是以在泛型程式設計中見到的那個t也就是template的首字母。

來看一個泛型程式設計的簡單樣例。

在面向對象的程式設計中還有一個概念叫多态,利用這種概念,我們可以将泛型程式設計中的t替換成所有對象的基類object,這在某種程度上同樣能夠達到泛型程式設計所達到的效果,如下方代碼所示。

我們來看看位元組碼。

foo方法調用時的位元組碼

foo2方法調用時的位元組碼

不難發現,main函數調用使用了泛型程式設計的foo方法時,其位元組碼已不再是t,而是替換為實際的stringbuilder類;反觀foo2方法使用的還是object,那它将是在運作時作類型轉換。

結論:泛型程式設計是編譯期替換;多态則是運作期作類型轉換。

不廢話,形如下方代碼即重載。

重載的特點:兩個及以上方法名相同;參數個數不同,參數順序不同、類型不同,以上任一種及以上都可以構成重載。僅傳回值不同不可構成重載。

測試的完整代碼如下:

接下來看看重載部分的位元組碼:

總結:看來位元組碼已經做了相應的轉換,重載和泛型程式設計相似,都是在編譯期就做了替換,而不是在運作時,但是重載需要為每一種不同的參數類型重新編寫代碼,代碼複用度不高。

泛型程式設計和重載是在編譯期作了類型替換,多态則是在運作期作類型轉換。

泛型程式設計和多态代碼複用度高,重載代碼複用度低。

當然,泛型、重載、多态更有其它設計模式的意義,在此不作讨論。