天天看點

原來你是這樣的JAVA[03]-繼承、多态、抽象類一、繼承二、多态三、抽象類

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()-&gt;Product.display()

Bread:

     display()-&gt;Bread.display()

     display(String name)-&gt;Bread.display(String name)

定義抽象方法用用abstract關鍵字,它僅有聲明而沒有方法體。

包含抽象方法的類叫做抽象類,如果一個類包含一個或多個抽象方法,那麼必須被定義為抽象類。

如果一個類從抽象類繼承,那麼必須為抽象類中的所有抽象方法提供實作,否則該類也必須被定義為抽象類。

看一個場景:我們有一些定時任務,要進行的工作流程類似,隻有具體一部分細節内容不同。我們可以定義一個抽象基類BaseJob,再不同的部分封裝為抽象方法,具體的實作在子類中進行。

建立單元測試,調用ArticleJob看看。

運作結果:

當再次添加符合該流程的定時任務時,隻需要建立一個類,實作BaseJob就可以了。

    本文轉自 陳敬(Cathy) 部落格園部落格,原文連結:http://www.cnblogs.com/janes/p/8309741.html,如需轉載請自行聯系原作者