1. 程式人生 > >Java核心技術學習筆記-繼承

Java核心技術學習筆記-繼承

java

繼承按照我們中文通俗的理解是不需要付出努力,就獲得別人的能力或資產,比如繼承父輩的家產,繼承父輩的表達能力,繼承父輩的外貌等等。在類裏面的繼承,可以理解不需要重新開發代碼,就能復用父類的方法和域。

在繼承關系裏面,可以分為父類和子類,子類繼承父類,那子類就有了跟父類一樣對外的方法和屬性,但是子類也可以擁有自己對外的方法和屬性,就好比你繼承了父輩的全部家產,但是還可以擁有屬於自己的資產一樣。所有繼承是一個is-a的關系。java類繼承用extends來表述繼承關系。例如:

class Manager extends Emloyee{}

子類除了可以繼承父類方法以外,也可以覆蓋父類方法,把這個覆蓋父類方法的行為稱之為override.值得註意的是,在覆蓋方法時,允許子類覆蓋方法的返回類型定義為原類型的子類型。例如:

public class Employee{ public Employee getBuddy(){……} }//父類Employee

public 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核心技術學習筆記-繼承