接口的繼承與抽象類

接口繼承

接口繼承(inheritance)與類繼承很類似,就是以被繼承的 interface 為基礎(chǔ),增添新增的接口方法原型。比如,我們以 Cup 作為原 interface,在繼承 Cup 的基礎(chǔ)上,定義一個新的有刻度的杯子的接口 MetricCup

interface Cup 
{
    void addWater(int w);
    void drinkWater(int w);
}

interface MetricCup extends Cup
{
    int WaterContent();
}

繼承后的 MetricCup 增添了一個新的方法原型 WaterContent(),這個方法返回一個整數(shù)(水量)。




interface 的多重繼承

在 Java 類的繼承中,一個衍生類只能有一個基類。也就是說,一個類不能同時繼承多于一個的類。在 Java 中,interface 可以同時繼承多于一個 interface,這叫做 多重繼承(multiple inheritance)。

我們創(chuàng)建一個 MusicCup 的接口。它既有 Cup 接口,又有 Player 接口,并增加一個 display() 方法原型:

interface Cup 
{
    void addWater(int w);
    void drinkWater(int w);
}

interface Player
{
    void play();
}

interface MusicCup extends Cup, Player 
{
    void display();
}

如何使用 interface,見實施接口一章。




抽象類

在生活中,我們會有一些很抽象的概念。這些抽象的概念往往是許多類的集合,比如:

  • 糧食 (可以是玉米、小麥、大米)
  • 圖形 (可以是三角形、圓形、正方形)

再比如,我們之前舉出了例子:人類 (可以是男人、女人)

在組織這樣的關(guān)系時,我們可以使用繼承,比如:

根據(jù)我們的常識:

Food 類的對象的說法是抽象的。這樣一個對象應(yīng)該是屬于 Corn, Rice, Wheat 子類中的一個,世界上不存在一種叫 Food 的食物。

Food 類有 eat() 方法(食物可以吃)。然而,這樣的一個動作是抽象的。糧食的具體吃法是不同的。比如 Corn 需要剝皮吃,Wheat 要磨成面粉吃。我們需要在每個子類中覆蓋 Food 類的 eat() 方法。

Java 中提供了 抽象類(abstract class)的語法,用于說明類及其方法的抽象性。用關(guān)鍵字 abstract 來表示:

abstract class Food 
{
    // 抽象方法
    public abstract void eat();
    
    public void happyFood();
    {
        System.out.println("Good! Eat Me!");
    }
}

類中的方法可以聲明為 abstract,比如上面的 eat()。這時,我們不需要具體定義方法,只需要提供該方法的原型。這與接口類似。當(dāng)我們在比如 Corn 類中繼承該類時,才需要提供 eat() 方法的具體定義。

類中的另一個方法 happyFood() 并不是抽象方法。

當(dāng)一個類中出現(xiàn) abstract 方法時,這個類的聲明必須加上 abstract 關(guān)鍵字,否則 Java 將報錯。一個 abstract 類不能用于創(chuàng)建對象。




抽象類的繼承

我們可以像繼承類那樣繼承一個抽象類。我們必須用完整的方法定義,來覆蓋抽象類中的抽象方法,否則,衍生類依然是一個抽象類。

抽象類的定義中可以有數(shù)據(jù)成員。數(shù)據(jù)成員的繼承與正常類的繼承相同。

abstract class Food 
{
    public abstract void eat();

    public void happyFood()
    {
        System.out.println("Good! Eat Me!");
    }
}


class Corn extends Food
{
    // 覆蓋抽象的 eat() 方法
    public void eat()
    {
        System.out.println("eat corn");
    }
}


public class Test
{
    public static void main(String[] args)
    {
        Corn aCorn = new Corn();
        aCorn.eat();
        aCorn.happyFood();                     
    }
}

輸出結(jié)果:

eat corn
Good! Eat Me!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容