標籤:java
繼承按照我們中文通俗的理解是不需要付出努力,就獲得別人的能力或資產,比如繼承父輩的家產,繼承父輩的表達能力,繼承父輩的外貌等等。在類裡面的繼承,可以理解不需要重新開發代碼,就能複用父類的方法和域。
在繼承關係裡面,可以分為父類和子類,子類繼承父類,那子類就有了跟父類一樣對外的方法和屬性,但是子類也可以擁有自己對外的方法和屬性,就好比你繼承了父輩的全部家產,但是還可以擁有屬於自己的資產一樣。所有繼承是一個is-a的關係。java類繼承用extends來表述繼承關係。例如:
class Manager extends Emloyee{}
子類除了可以繼承父類方法以外,也可以覆蓋父類方法,把這個覆蓋父類方法的行為稱之為override.值得注意的是,在覆蓋方法時,允許子類覆蓋方法的傳回型別定義為原類型的子類型。例如:
public class Employee{ public Employee getBuddy(){……} }//父類Employeepublic class Manager extends Employee { public Manager getBuddy(){……} //子類override getBuddy方法,傳回型別為原類型的子類型}
--那麼繼承是如何?,內部實現原理是怎麼樣的?
1、每個對象在調用方法的時候,實際上方法存在一個隱式參數,例如:
Manager mg=new Manager();mg.getBuddy(); //getBuddy實際上存在一個隱式參數,當前對象的引用,執行是會將對象引用傳進去,變成mg.getBuddy(mg);
2、每個類,虛擬機器都會為每個類預先建立一個方法表(method table),用來記錄所有方法所對應的記憶體位址。在調用方法的時候,直接去找方法對應的記憶體位址進行執行,如果是單純的繼承,相當於預設給子類建立一個跟父類類似的method table。
例如:
Employee:getName->Employee:getName()getBuddy->Employee:getBuddy()Manager:getName->Employee:getName()getBuddy->Manager:getBuddy()
因此,對於不同的子類對象調用子類方法時,會從子類方法表中,查詢該方法的地址,如果子類覆蓋父類方法,那麼對應的方法的地址也被修改了,進而實現多態。
--如何阻止繼承:
final,如果將類定義為final,那麼該類就不能被其他類繼承,值得注意的是,如果類被定義成final,其方法也自動被定義為final,但是屬性域並沒有被自動定義成final.
Java核心技術學習筆記-繼承