Interface


1 interface介紹及使用

乍看之下,會覺得interface就像是沒有任何function被實作的抽象類別,但其實這兩個是完全不同的概念。

以大學的運作作為例子,裡面有許多的與學校運作有關的人士,其中有學生這個類別,他的子類別可以有大學生、研究生等。

public class Students {
    public String name;
    private String id;
    private int age;
    private String sex;
    private String department;
    Students(String s){
        name=s;
    }
    public void ClassRollCall(){
        System.out.println("今日在課堂上點名成功");
    }
}

class UnderGraduate  extends Students{
    UnderGraduate(String s){
        super(s);
    }
}

class PostGraduate extends Students{
    PostGraduate(String s){
        super(s);
    }
}

只要是透過繼承的方式,無論是繼承自抽象類別還是一般類別,我們都可以說他的子類別是它的其中一種,例如圓形是形狀的一種,大學生是學生的一種 (其中形狀可以設為抽象類別,學生可設為一般類別)。

但是大學內的學生也有可能是一位住宿生,需要做只有住宿生才需進行的活動,例如夜間點名。學生也有可能是一位借了學貸的學生,在特定的時間需要還款。這時候如果我們還繼續使用繼承就會遇到困難。

因為大學生和研究生的其中幾位有可能是住宿生或學貸生,但我們不會說大學生和研究生是住宿生的一種,也不會說住宿生是大學生和研究生的一種。這兩種說法邏輯都怪怪的。

因為 (大學生) 和 (住宿、借貸生) 實際上沒有實際關係,我們不能讓所有大學生都需要晚點名和還貸款。

兩者之間有 a是b的一種 的關係,使用class a extends class b

還有還記得我們講過,使用繼承的話JAVA只允許單一繼承,這時候一位大學生如果同時是住宿生又是貸款生,用繼承的話就會遇到問題,因為大學生已經繼承自學生類別,無法再繼承自住宿生和貸款生了。

所以我們會偏向說interface是一種動作

兩者之間有 a需要做b的動作 的關係,於是使用class a implements interface b

例如:研究生是學生的一種,吳小姐是一位研究生,但她同時又需要做所有住宿生貸款需做的事,也需要做需做的事。

所以我們知道了住宿生跟貸款生都需要用interface來表達,如以下程式碼

interface LiveInDorm{
    public String CurFew="22:00"; 
    public void RollCall();
}

interface HaveStudentLoan{
    public void Repay();
}

可以注意到 interface裡全部都是沒有實作的abstract function,當撰寫在interface裡面時即使沒有標註abstract,編譯器也會自動判定為abstract

而interface的變數,會被統一判定成static final,所以一定要記得給予它初值

public String CurFew="22:00";
public static final String CurFew="22:00";

我們建立一個特殊學生,符合吳小姐的需求

class TypeAStudents extends UnderGraduate implements LiveInDorm,HaveStudentLoan{
    public void DormRollCall(){
        System.out.println("今日在宿舍點名成功");
    }
    public void Repay(){
        System.out.println("已還款");
    }
}

可以看到她implements了兩個interface,而且都實作了所有的function

public class MainClass {
    public static void main(String[] args){
        TypeAStudents MissWu=new TypeAStudents("吳小姐");
        MissWu.ClassRollCall();
        MissWu.DormRollCall();
    }
}
---------------------------
吳小姐今日在課堂上點名成功
吳小姐今日在宿舍點名成功

2 Interface extends Interface

介面當然也可以使用繼承,但是他只能繼承自介面

public interface 名稱 extends interface1, interface2 {
    ....
}
interface typeA extends LiveInDorm,HaveStudentLoan{

}

class TypeAStudents extends UnderGraduate implements typeA{
    TypeAStudents(String s){
        super(s);
    }
    public void DormRollCall(){
        System.out.println(name+"今日在宿舍點名成功");
    }
    public void Repay(){
        System.out.println(name+"已還款");
    }
}

results matching ""

    No results matching ""