多態學習續 抽象類和接口
最近在學習張龍老師的Java SE視頻教程,此為背景。
本篇內容是多態學習的第二部分,主要講抽象類和接口的簡單概念。
抽象類abstract class
用關鍵字abstract修飾的類叫做抽象類,抽象類不能被實例化,即不能new出來一個抽象類的對象(實例)。
抽象方法
用abstract關鍵字所修飾的方法叫做抽象方法。
抽象方法必須定義在抽象類中。
抽象方法有聲明,無實現(沒有花括號{},有花括號但是內容為空也是一種實現,空實現)。
相對應的有聲明有實現的方法可以叫做具體方法。
抽象類和抽象方法的關系
抽象方法必須定義在抽象類里面。
如果一個類包含了抽象方法,那么這個類一定要聲明成抽象類。
如果某個類是抽象類,那么這個類既可以包含抽象方法,也可以包含具體的方法(有聲明,有實現)。
抽象類中如果全是具體方法也是允許的;抽象類也可以是空的,即什么也不包含。
抽象類的繼承
在父類是一個抽象類的情況下,子類繼承父類時,有兩種選擇:
1.子類是抽象類
那么子類在聲明時仍然需要abstract關鍵字,子類可以選擇實現或者不實現父類的抽象方法,(因為抽象類中也可以包括具體方法,甚至可以全是具體方法)。
但是無論怎樣,因為子類還是一個抽象類,所以不能實例化。
2.子類不是抽象類
子類不是抽象類時可實例化,但是這時候子類必須實現父類所有的抽象方法。
實現抽象方法的時候不必再使用abstract關鍵字。
抽象類的用途
抽象類的抽象方法定義一個規范,或者叫做約定,具體實現交給子類來做。
因為抽象類的實現可能無法完成或者沒有意義。
舉個例子:
定義一個抽象類Shape,然后Triangle,Circle和Rectangle等繼承Shape,Shape中定義一個抽象方法計算面積,然后各個子類中實現這個方法,計算各自的面積。
這時候如果不用抽象類和抽象方法,即Shape類是一個普通的類,也可以完成這樣的功能,即通過用子類方法覆蓋父類方法的方式。
但是此時父類,即Shape中的方法就要提供具體的實現,首先不知道怎么計算這個抽象的形狀的面積,如果父類面積定義一個常數,如0或1,又顯得意義不明晰。
接口
接口用關鍵字interface聲明。
接口的地位等同於class,接口中的所有方法都是抽象方法。
接口中在定義方法的時候,可以使用abstract關鍵字,也可以省略abstract關鍵字,(大多數時候都是省略的),方法仍是抽象的,不能有實現的花括號。
接口和抽象類的功能類似,接口也不能實例化,可以將接口看作是一種特殊的抽象類(全是抽象方法)。
接口的多態用法和抽象類也類似,接口類型的引用可以指向實現了這個接口的類的對象。
接口和抽象類的區別如下:
接口中的方法必須全是抽象方法;而抽象類中的方法,可以有抽象的,也可以有具體的方法。
類可以實現接口,用關鍵字implements。Java是單繼承的,但是卻可以實現多個接口。(一個類可以同時繼承另一個類,並且實現多個接口。)
如果一個類實現了一個接口,並且這個類不是抽象類,那么這個類必須實現這個接口中的所有方法。如果是抽象類,則無需實現接口中的所有方法。
多態
所謂多態,就是父類型的引用可以指向子類型的對象,或者接口類型的引用可以指向實現該接口的類的實例。
關於接口與實現接口的類之間的強制類型轉換方式與父類和子類之間的強制類型轉換方式完全一樣。(見下面的多態文章鏈接)。
本博客相關文章
接口:http://www.cnblogs.com/mengdd/archive/2012/08/22/2650309.html
多態:http://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html