Java中的繼承使用關鍵字extends ,跟C#的文法略有差别。
java會自動在子類的構造器中插入對父類構造器的調用,也就是說在子類可以通路父類之前已經完成了父類的初始化。
如果想調用帶參數的父類構造器,應該使用super關鍵字。
<a></a>
我們建立一個Bread類的執行個體,看看調用順序。
列印結果:
[Product constructor]
[Bread constructor]
子類是不能直接通路到父類的私有域的,如果想通路隻能借助父類公開的get通路器。子類調用父類中的方法也需要使用super關鍵字。
然後寫個單元測試:
需要說明一點,super并不是一個對象的引用,不能将super指派給變量,它隻是一個特殊的關鍵字,告訴編輯器要調用父類中的方法。
如果父類中存在重載方法,子類又進行了重載,會覆寫父類中的方法嗎?實際上,父類和子類中的方法都可以正常重載,不會被覆寫。
首先在父類Product中添加方法getDescription():
然後在子類中重載該方法:
增加一個單元測試:
輸出:
[Product]name=豆沙面包
[Bread]storename=味多美
繼承準則:盡量少用繼承。一般用繼承表達行為間的差異,用組合表示狀态上的變化。
在Java中對象變量是多态的,一個Product變量可以引用Product對象,也可以引用一個Product子類的對象。
由于Bread執行個體向上轉型為Product類型,是以不能再調用Bread.getDescription(String storeName)方法。
如果需要将父類強制轉換為子類時,要先通過instanceof檢測對象類型,我們最好盡量避免使用強制類型轉換。
所謂動态綁定,就是在運作時根據對象的類型決定要調用的方法。在java中,動态綁定是預設行為,不需要添加額外的關鍵字實作多态。
再寫個demo來看一下,在父類和子類中重載了display方法。
添加單元測試:
虛拟機為每個類建立一個方法表,列出所有方法的簽名和實際調用的方法。這樣一來,當動态調用方法的時候,隻需要查找方法表就能快速的找到真正調用的方法了。
Product:
display()->Product.display()
Bread:
display()->Bread.display()
display(String name)->Bread.display(String name)
定義抽象方法用用abstract關鍵字,它僅有聲明而沒有方法體。
包含抽象方法的類叫做抽象類,如果一個類包含一個或多個抽象方法,那麼必須被定義為抽象類。
如果一個類從抽象類繼承,那麼必須為抽象類中的所有抽象方法提供實作,否則該類也必須被定義為抽象類。
看一個場景:我們有一些定時任務,要進行的工作流程類似,隻有具體一部分細節内容不同。我們可以定義一個抽象基類BaseJob,再不同的部分封裝為抽象方法,具體的實作在子類中進行。
建立單元測試,調用ArticleJob看看。
運作結果:
當再次添加符合該流程的定時任務時,隻需要建立一個類,實作BaseJob就可以了。
本文轉自 陳敬(Cathy) 部落格園部落格,原文連結:http://www.cnblogs.com/janes/p/8309741.html,如需轉載請自行聯系原作者