Java動態綁定

一、重載與重寫

爲了方便後文的理解,先說一下重載和重寫的區別。

重載(Overloading)是指一個類中的多個方法的方法名相同,而參數的類型與個數不同,返回參數也不同。

重寫(Overriding)是指子類對父類的方法進行重新定義。重寫要求子類重新定義父類方法時,方法名,參數個數,參數類型以及返回類型都要與父類中該方法相同。重寫又稱爲覆蓋

很顯然,當調用一個類中某一方法時,如果該方法只存在重載,不存在重寫,那麼編譯器便可以根據參數的個數和參數類型,確定具體調用的是哪一個類中的哪一個方法。但如果存在重寫,那麼編譯器就無法分辨出調用的是父類中的該方法,還是子類中重寫的方法,而是需要程序運行時,才能夠確定。


二、動態綁定與靜態綁定

像上文所說的那樣,將程序所調用的方法與具體類中的某方法關聯起來,就叫做綁定

靜態綁定指在編譯時期就能完成的綁定,而動態綁定指需要等到程序運行時才能完成的綁定。

靜態綁定依靠類信息(方法名,參數名等)來完成,而動態綁定則需要依靠對象信息來完成。

private方法,static方法,final方法和構造方法一定是靜態綁定。

如果類B是類A的子類,A中定義了方法func(String s),B中重寫了方法func(String s),那麼此方法就需要使用動態綁定。如果x是B的一個實例,通過x.func(str)調用方法時,Java虛擬機會先在B中尋找此方法,如果B類中有對應方法,則直接調用它,否則就在B的父類A中尋找此方法。


三、爲什麼private方法,static方法,final方法和構造方法是靜態綁定

1、private方法無法被繼承,那麼自然無法被重寫,所以在編譯時就可以確定具體調用的方法

2、static方法可以被繼承,可以被子類隱藏,但是不能被子類重寫。所以也可以在編譯時確定

3、final方法可以被繼承,但是不能被子類重寫

4、構造方法也不能被子類繼承。子類的構造方法有兩種:使用系統自動生成的無參數構造方法;調用父類的構造方法(包括自己定義構造方法並在其中調用父類的構造方法)

由以上分析我們可以看出,上述四種方法可以使用靜態綁定的最終原因都是:不會出現方法重寫,不會產生子類與父類具有信息(方法名,參數個數,參數類型,返回類型等)完全相同的方法。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章