java — 靜態綁定和動態綁定


  綁定:一個方法的調用與方法所在的類關聯起來。java中的綁定分為靜態綁定和動態綁定,又被稱作前期綁定和后期綁定。

  靜態綁定:(final、static、private)在程序執行前已經被綁定,也就是說在編譯過程中就已經知道這個方法是哪個類的方法,此時由編譯器獲取其他連接程序實現。

  動態綁定:在運行根據具體對象的類型進行綁定。

 

1.靜態綁定

  private:不能被繼承,則不能通過子類對象調用,而只能通過類本身的對象進行調用,所以可以說private方法和方法所屬的類綁定;

  final:final方法雖然可以被繼承,但是不能被重寫(覆蓋),雖然子類對象可以調用,但是調用的都是父類中的final方法(因此可以看出當類中的方法聲明為final的時候,一是為了防止方法被覆蓋,而是為了有效關閉java的動態綁定);

  static:static方法可以被子類繼承,但是不能被子類重寫(覆蓋),但是可以被子類隱藏。(這里意思是說如果父類里有一個static方法,它的子類里如果沒有對應的方法,那么當子類對象調用這個方法時就會使用父類中的方法。而如果子類中定義了相同的方法,則會調用子類的中定義的方法。唯一的不同就是,當子類對象上轉型為父類對象時,不論子類中有沒有定義這個靜態方法,該對象都會使用父類中的靜態方法。因此這里說靜態方法可以被隱藏而不能被覆蓋。這與子類隱藏父類中的成員變量是一樣的。隱藏和覆蓋的區別在於,子類對象轉換成父類對象后,能夠訪問父類被隱藏的變量和方法,而不能訪問父類被覆蓋的方法)。

 

2.動態綁定

  調用的方法依賴於隱式參數的實際類型,並且在運行時實現動態綁定。動態綁定的過程分為以下幾個環節:

  (1)編譯器查看對象的聲明類型和方法名;

  (2)編譯器查看調用方法時提供的參數類型。例如x.f("hello"),編譯器將會挑選f(String),而不是f(int),由於存在類型轉換(int轉換為double),所以可能會更復雜。如果編譯器沒找到參數類型匹配的方法,或者發現有多個方法與之匹配,就會報告一個錯誤。

  至此,編譯器獲得了需要調用的方法名字和參數類型。

  (3)采用動態綁定調用方法的時候,一定調用與所引用對象的實際類型最合適的類的方法。如果x的實際類型是D,它是C類的子類,如果D定義了一個方法f(String),就直接調用它,否則將在D類的超類中尋找f(String),以此類推。

 

  每次調用方法都要進行搜索,時間開銷太大,所以虛擬機預先為每個類創建一個方法表(method table),其中列出了所有方法的簽名和實際調用的方法。這樣在調用方法的時候,只需要查找這個表即可。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM