super 和 this 关键字的比较+调用构造器(this)+动态绑定
【0】README
0.1) 本文描述+源代碼均 轉自 core java volume 1, 旨在加深對 super 和 this關鍵字 的用法比較;
0.2) 最后還補充了 多態和動態綁定 的定義 以及對動態綁定進行了詳細分析,這兩個定義給的非常棒;
【1】super 和 this 的比較:
1.1) 有人認為super 和 this 引用是類似的概念,實際上,這樣比較并不太恰當;因為super不是一個對象引用, 不能將super 賦給另一個對象變量,它只是一個編譯器調用超類方法的特殊關鍵字;
1.2)我們再看super在構造器中的應用:
- 這里的super含義是: super(n, s, year, month, day) 是“調用超類Employee中含有 n、s、year、month 和 day” 參數的構造器的簡寫形式;
- 這是由于: Manager類的構造器不能訪問 Employee類 的私有域, 所以必須利用 Employee類的構造器對這部分私有域 進行初始化;
Attention)
- A1)而且 使用 super調用構造器的語句必須是 子類構造器的第一條語句;
- A2)如果子類的構造器沒有顯式地 調用超類的構造器,則將自動地調用超類默認構造器;
Annotation)關鍵字this + super 有兩個用途:
- A1)this的用途:一是引用隱式參數+二是調用該類其它的構造器;
- A2)super的用途:一是調用超類 的方法 + 而是調用超類都構造器;
【2】調用構造器
2.1)調用構造器的注意事項 : 調用構造器的語句只能作為 另一個構造器的第一條語句出現, 構造參數既可以傳遞給本類的其他構造器, 也可以傳遞給超類的構造器;
2.2)看個荔枝(利用this調用其他構造器):
2.3)Complementary
- C1)多態: 一個對象變量可以指示多種實際類型的現象 被稱為多態;(如上述代碼中的 e 即可以指向 Manager類 也可以指向 Employee類)
- C2)動態綁定:在運行時能夠自動地選擇調用哪個方法的現象稱為動態綁定;
【3】 動態綁定
3.1)定義: 在運行時能夠自動地選擇調用哪個方法的現象稱為 動態綁定 ;
如:
- e.getSalary() 調用能夠確定應該執行哪個 getSalary 方法, 請注意, 這里雖然將e 聲明為 Employee 類型,但實際上 e 既可以引用Employee 類型的對象,也可以引用Manager 類型的對象;
3.2)看一下對象方法的執行過程,調用過程的詳細描述(Description):
- D1)編譯器查看對象的聲明類型和方法名:例如可能存在方法 f(int) 和 方法 f(String), 編譯器將會一一列舉所有C類中名為f的方法和其超類中訪問屬性為public 且名
為f的方法; - D2)編譯器將查看調用方法時提供的參數類型:
重載解析:如果在所有名為f 的方法中存在一個與提供的參數類型完全匹配, 就選擇這個方法,這個過程叫做重載解析; - D3)如果是private、static、final 方法或者構造器, 那么編譯器將可以正確地知道應該調用哪個方法;我們將這種調用方式叫做靜態綁定;與此對應的是,調用的方法依賴于隱式參數的實際
類型,并且在運行時實現動態綁定; - D4)當程序運行, 并且采用動態綁定調用方法時, 虛擬機一定調用與x 所引用對象的實際類型最合適的那個類的方法;假設x 的實際類型為D, 它是C類的子類, 如果 D類定義了 方法f(string), 就直接調用它,否則將在D類的超類中尋找f(string), 以此類推;
3.3)方法表:每次調用方法都要進行搜索, 時間開銷相當大, 因此虛擬機預先為每個類創建了一個方法表(method table), 其中列出了所有方法的簽名和實際調用 的方法;
Annotation)
- A1)方法簽名:方法的名字和參數列表稱為方法的簽名; 如,f(int) 和 f(String) 是兩個具有相同名字、不同簽名的方法;如果在子類中定義了一個與超類簽名相同的方法,那么子類中的這個方法就覆蓋了超類中的這個相同簽名的方法;
- A2)返回類型不是方法簽名的一部分:因此,在覆蓋方法時, 一定要保證返回類型的兼容性;允許子類將覆蓋方法的返回類型定義為原返回類型的子類型;
如父類有: public Employee getBuddy(){}, 子類可以覆蓋它, public Manager getBuddy(){} ;我們說,這兩個 getBuddy 方法具有 可協變的返回類型 ;
3.4)在運行的時候, 調用 e.getSalary() 的解析過程(Procedure):
- P1)首先,虛擬機提取e 的實際類型的方法表: 既可能是Employee、Manager的方法表,也可能是 Employee 類的其他子類的方法表;
- P2)接下來, 虛擬機搜索定義 getSalary 簽名的類, 此時,虛擬機已經知道應該調用哪個方法;
- P3)最后,虛擬機調用方法;
3.5)動態綁定有一個重要的特性:無需對現在的代碼進行修改, 就可以對程序進行擴展。
Alert)在覆蓋一個方法的時候, 子類方法不能低于超類方法的可見性;特別是, 如果超類方法是public, 子類方法一定要聲明為public;
總結
以上是生活随笔為你收集整理的super 和 this 关键字的比较+调用构造器(this)+动态绑定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 韩国烧酒怎么喝 有什么方法
- 下一篇: 马良怎么死的 马良的死因