因為工作原因很長時間沒更新了,在此表達深深的歉意。
有人說我寫的東西太簡單,沒什么技術含量。嗯,說的也是,但我覺得網上關于Java技術文章太多,寫得比我好的深刻的數不勝數。而真正幫助新手入門的文字卻很少,并且本人也是個半吊子,復雜的東西弄不來就先把簡單的闡述清楚,與讀者一起進步。
本來今天是想寫多態,但不說說接口可能對多態也是一知半解。照例我們還是帶著問題去行文。
- 什么是抽象類?
- 什么是接口?有何作用?
通過前面的文章我們可以知道,當定義一個類的時候需要定義一些方法來描述該類的行為特征,但有的時候這些方法是無法確定的。簡單來說,我們定義一個Animal類,里面有個shout方法,這時我們就不能確定這個類里面具體要寫啥,因為針對不同動物叫聲也是不同的。比如,這里有個Dog類它的shout方法里面是“汪汪汪”,另外有個Cat類它的shout方法里面是“喵喵喵”,當它們同時繼承Animal類的時候,其中的shout方法到底要寫什么了?
針對上面的情況,Java允許在定義方法是不寫方法體,那么不包含方法體的方法便成為抽象方法,抽象方法必 須用abstract關鍵字來修飾,具體事例如下:
abstract void shout(); //定義抽象方法shout
并且規定當一個類中包含了抽象方法,該類必須使用abstract關鍵字來修飾,該類則成了抽象類
abstract class Animal{
abstract String shout();
}
另外需要注意的是,抽象類是不能被事例化的即不可以被new出來,這是因為抽象類中可能包含抽象方法,而它是沒有方法體的,便不可以被調用。如果想調用抽象類中的方法,則要創建一個子類,在子類中將抽象類中的方法進行實現,具體代碼如下:
最后運行結果是,輸出“我是可愛的大妞”。這就說明當子類實現父類的抽象方法后,可以正常視力實例化,并通過實例化對象調用方法。
了解了抽象之后,我們看看什么是接口?
如果一個抽象類中的所有方法都是抽象的,則可以將這個類用另一種方式來表達,這就是接口。具體事例如下:
interface Animal{
int a = 1;
void breathe();
void run();
}
上面的代碼中,Animal即為一個接口。接口中定義的方法默認使用“public abstract”來修飾,變量默認使用“public static final”來修飾。方法都是抽象的,所以它不能通過實例化對象的方法來調用接口中的方法。此時便需要定義一個類,并使用implements關鍵字實現接口中所有的方法。
接口的特點如下:
- 接口中的方法都是抽象的,不能實例化對象。、
- 當一個類實現接口時,如果這個類是抽象類,則實現接口中的部分方法即可,否則要實現接口中的所有方法。
- 一個類通過implements實現接口時,可以實現多個接口,被實現的多個接口之間要用逗號隔開。
- 一個接口可以通過extends繼承多個接口,接口之間用逗號隔開。
- 一個類在繼承另一個類的同時還可以實現接口,此時extends必須位于implements之前。
今天有點倉促,明天在給出具體的示例。