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+"已還款");
}
}