舉個例子:
class pf
class ps extends pf
public static void f(ps p)
public static void main( string args )
}
上面的呼叫會執行哪乙個過載版本?
結果:fulei
為什麼?
這涉及到了虛擬機器選擇方法版本的問題。專業的術語是「方法分派」。分為靜態和動態。靜態分派針對的是過載方法,動態分派針對的是重寫方法。上面的例子就是靜態分派的例子。
對於靜態分派,我們說先得了解兩個型別的概念
pf p = new ps();
這段**,裡面包含了兩個型別。左邊的是宣告型別也叫靜態型別,右邊的是實際型別。虛擬機器在確定過載版本的時候是按照靜態型別來確定的,p的型別是父類,所以會呼叫引數為父類型別的方法。靜態分派只看靜態型別,與實際型別沒有任何關係。所以靜態分派也是在編譯期完成的,也即過載方法版本的確定是在編譯期就完成了。
而我們更為熟悉的多型是動態分派,虛擬機器在編譯時不會完成方法版本的確定,具體是在執行時確定的。執行時虛擬機會得到每乙個物件的靜態型別和實際型別,然後去實際型別的方法區查詢方法是否存在,不存在的話再往上查詢父類是否存在。當然為了避免每一次都去查詢,虛擬機器可能會為每乙個型別建立乙個方法表,裡面儲存了這個實際型別的方法入口,這樣效率更高。
aix確定VG型別方法
確定 vg型別方法 aix5.2 增加了big vg 型別,aix5.3 以後,vg有了3 種型別,普通 vg,big vg 和scalable vg lsvg vg volume group vg vg identifier 00c5bf9c00004c0000000112da58dbf3 vg ...
java中泛型確切型別的確定
在寫android mvp模式的框架時,發現了乙個點,就是如果用泛型來簡化 同時總結了一下確定泛型的確切型別的方法。目前發現了如下的兩種方法,今後遇到了再繼續追加。就像是arraylist的例項化,如 arraylist arraylist new arraylist 我們知道arraylist型別...
C 中確定型別
includeusing namespace std templatestruct iter t operator const templatetypename i value type 這一整行是func的返回型別func i item int main itert new int 10 cout...