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

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.