Java——接口的學習

今天繼續填坑,講一下接口。說起接口,其實我們可以把它當做一種特殊的抽象類,接口中有着抽象方法。但不同於類的是,它可以存在一個類有多個接口。接下來,我用一個例子形象的描述一下接口。

在這裏插入圖片描述

例如,有兩個抽象類:Animal和Fruit,其中Fruit的子類均可以食用,而Animal中存在一些子類(Tiger)不能被食用。如果我們要構建一下howToEat()方法,按照上一次我們講的多態知識,我們會在抽象類Animal和Fruit中構造howToEat方法,然後被子類所繼承。但是這就帶來一個問題,由於子類必須強制重寫抽象父類中的howToEat方法,使得Tiger這個不能食用的類也要重寫方法。這就給我們袋來了一些邏輯上的不便。此時。接口應運而生。

接口在這個例子中,可以當作一個類中的一種共同的方法,只要讓能食用的類接上這個接口,就可以構造了這個方法了。

//接口代碼
public interface Edible {   //interface是接口的關鍵字
    public abstract String howToEat();  //定義了一個抽象方法,該方法不要求寫內容,只要定義名字和返回值即可
}

接着再構建幾個類。

abstract class Animal{}

class Chicken extends Animal implements Edible{ //implement是接上接口的關鍵字

    @Override   //這裏系統會強制進行方法重寫,如果方法沒有寫或者寫錯了,會一直報錯
    public String howToEat() {
        return "Chicken: Fry it";
    }
}

class Tiger extends Animal{}

abstract class Fruit implements Edible{}

class Apple extends Fruit{

    @Override
    public String howToEat() {
        return "Apple: make apple cider";
    }
}

class Orange extends Fruit{
    public String howToEat(){
        return "Orange: make orange juice";
    }
}

可以發現,父類接上了接口後,子類也會自動接上了父類接口。同時接口還可以定義成一個數組,通過多態實現向上轉型,我們可以看一個例子。

Edible[] edibles = {new Chicken(),new Apple(), new Orange()};
        for(Edible e : edibles){
            System.out.println(e.howToEat());
        }

在上面代碼中,我用接口實例化了三個類。這裏有個好處就是,當我想實例化Tiger的時候,系統因爲檢測到Tiger沒有存在這個接口而報錯。這裏其實就有類似於泛型的意思了,如果沒有用接口,而是使用Object類來建立一個數組,想要實現howToEat就要進行判斷了。

Object[] objects = {new Tiger(),new Apple(),new Chicken()};
        for(Object o : objects){
            if(o instanceof Edible)  //這裏進行判斷類中是否有Edible的接口
                System.out.println(((Edible) o).howToEat());
        }

如上述代碼所示,要進行判斷。說完了接口,今天又來增加額外的知識點:泛型。泛型的定義是:參數化類型。簡單說就是系統通過自動識別傳入的參數,如果不符合類型就會報錯。我們舉個簡單的例子。

List list = new ArrayList();
        list.add("Qiqi");
        list.add("MiaoMiao");
        list.add(100);

        for(int i=0; i<3; i++)
        {
            String a = (String)list.get(i);
            System.out.println(a);
        }

這裏先建立了List系列的集合,向裏面儲存字符串和整數,但是當我們運行後發現系統報錯。主要原因是我們要取出字符串類型的數據,但是有個整形數字混在其中,導致出錯。如果我們要規定輸入的數據一定是字符串,爲了防止出錯,我們可以使用泛型。

List<String> list = new ArrayList();
        list.add("Qiqi");
        list.add("MiaoMiao");
        //list.add(100);  系統報錯

        for(int i=0; i<2; i++)
        {
            String a = (String)list.get(i);
            System.out.println(a);
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章