在實作介面中,我們利用interface語法,將interface從類別定義獨立出來,構成一個主體。 interface為類別提供了介面規格。
在繼承中,我們為了提高程式的可重複使用性,引入的繼承機制。當時的繼承是基於類別的。 interface介面同樣可以繼承,以拓展原interface。
介面繼承
介面繼承(inheritance)與類別繼承很類似,就是以被繼承的interface為基礎,增添新增的介面方法原型。例如,我們以Cup作為原interface:
複製代碼代碼如下:
interface Cup {
void addWater(int w);
void drinkWater(int w);
}
我們在繼承Cup的基礎上,定義一個新的有刻度的杯子的接口,MetricCup
接口如下:
複製代碼代碼如下:
interface MetricCup extends Cup
{
int WaterContent();
}
我們增添了一個新的方法原型WaterContent(),這個方法傳回一個整數(水量)。
interface的多重繼承
在Java類別的繼承中,一個衍生類別只能有一個基底類別。也就是說,一個類別不能同時繼承多於一個的類別。在Java中,interface可以同時繼承多於一個interface,這叫做多重繼承(multiple inheritance)。
例如我們有下面一個Player介面:
複製代碼代碼如下:
interface Player
{
void play();
}
我們新增一個MusicCup的介面。它既有Cup接口,又有Player接口,並增加一個display()方法原型。
複製代碼代碼如下:
interface MusicCup extends Cup, Player
{
void display();
}
(如何使用interface,見實施介面)
抽象類別
在生活中,我們會有一些很抽象的概念。這些抽象的概念往往是許多類別的集合,例如:
1.糧食(可以是玉米、小麥、米)
2.圖形(可以是三角形、圓形、正方形)
再例如,我們之前舉出了例子:
1.人類(可以是男人、女人)
在組織這樣的關係時,我們可以使用繼承,例如:
根據我們的常識:
1."Food類別的物件"的說法是抽象的。這樣一個物件應該是屬於Corn, Rice, Wheat子類別中的一個。
2.Food類有eat()方法(食物可以吃)。然而,這樣的一個動作是抽象的。糧食的具體吃法是不同的。例如Corn需要剝皮吃,Wheat要磨成麵粉吃。我們需要在每個類別中覆蓋Food類別的eat()方法。
抽象與具體
Java中提供了抽象類別(abstract class)的語法,用來說明類別及其方法的抽象性。比如:
複製代碼代碼如下:
abstract class Food {
public abstract void eat();
public void happyFood();
{
System.out.println("Good! Eat Me!");
}
}
類別中的方法可以宣告為abstract,例如上面的eat()。這時,我們不需要具體定義方法,只需要提供該方法的原型。這與介面類似。當我們在例如Corn類別中繼承該類別時,就需要提供eat()方法的具體定義。
類別中的另一個方法happyFood()並不是
當一個類別中出現abstract方法時,這個類別的宣告必須加上abstract關鍵字,否則Java會報錯。一個abstract類別不能用來建立物件。
抽象類別的繼承
我們可以像繼承類別那樣繼承一個抽象類別。我們必須用完整的方法定義,來覆寫抽象類別中的抽象方法,否則,衍生類別依然是抽象類別。
抽象類別的定義中可以有資料成員。資料成員的繼承與正常類別的繼承相同。
總結
interface繼承,多重繼承
abstract method, abstract類