參考:介面-java教程-廖雪峰的官方網站
介面引入
public abstract class Person {
private String name; // String是基本型別嗎?如果不是,那是什麼型別
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public abstract void eat(); // 抽象方法的訪問許可權只能是public嗎?
public abstract void sleep();
@Override
public String toString() {
return "姓名:" + name + ", 年齡:" + age;
}
}
用interface關鍵字宣告介面
如果一個抽象類沒有(例項)欄位;
所有方法都是抽象方法
public abstract class Person {
public abstract void eat(); // 抽象方法的訪問許可權只能是public嗎?
public abstract void sleep();
}
就可以把該抽象類改寫為介面,介面可以理解為一種特殊的抽象類
在Java中用interface
關鍵字來宣告介面。
public interface Person {
public abstract void eat();
public abstract void sleep();
}
因為介面定義的所有方法預設都是public abstract
的,所以這兩個修飾符不需要寫出來(寫不寫效果都一樣)
public interface Person {
void eat();
void sleep();
}
implements關鍵字
一旦某個普通類繼承了抽象類,就意味著必須要實現它定義的抽象方法
在介面的語境下,不再叫作繼承,而叫做實現
一旦某個普通類實現了一個介面,即意味著它必須定義介面中的所有方法。我們把這個類叫作介面實現類。
要宣告一個類實現某個介面,需要使用關鍵字implements
(不再是extends
!!!)
public class Student implements Person {
// 實現一個介面, 必須對介面中的所有方法提供定義,否則編譯不透過!!!
}
簡單說,就是需要實現介面中的所有方法(即:需對照著介面中的方法列表,在介面實現類中定義相應的方法!)
public class Student implements Person {
public void eat() {
}
public void sleep() {
// 需要把隱藏的public寫出來
}
}
最終效果也是和抽象類一致的,也是定義了一種規範,凡是實現了xx介面就必須定義xx方法。例如上面Student類實現了Person介面就必須定義eat和sleep方法。
小結
介面可理解為一種特殊的抽象類
用interface
關鍵字宣告介面,用implements
關鍵字實現介面
與抽象類類似,不能例項化,只能被繼承實現,強迫實現類定義介面中的所有(抽象)方法,否則編譯報錯
實際也是定義了某種規範,凡是實現了xx介面就必須定義xx方法。
介面與抽象類
既然介面與抽象類如此相似,為什麼Java語言的設計者還要大費周折地引入介面呢?
這是因為使用抽象類存在一個嚴重的問題,在Java中每個類只能繼承一個類,也就是extends後面只能由一個類
但每個類卻可以實現多個介面。
例如一個人往往有多重身份或者功能,例如一個人可以既是一個工人、也是一個爸爸。這樣原有的繼承機制就無法表達。
那為什麼不乾脆提供多重繼承的機制?
這是因為Java語言設計者認為多重繼承會讓語言變得非常複雜,或者效率降低。
實際上,介面可以提供多重繼承的大多數好處,還能避免多重繼承的複雜性和低效性。
介面特性(試一試)
★不能建立介面物件,但可以宣告介面變數
★介面變數只能引用實現了該介面的類的物件
與類的結構層次一樣,也可以擴充套件介面
介面中不能有例項欄位,但可以包含常量(可透過介面名訪問)
★每個類只能有一個超類,但可以實現多個介面
練習
練習1
1定義一個介面Moveable
(可移動的),在介面中實現一個抽象方法:
void move();
2建立多個類實現介面:
- Car類在move()方法中,列印輸出“汽車在公路上行駛”
- Ship類在move()方法中,列印輸出“輪船在水面上航行”
- Aircraft類在move()方法中,列印輸出“飛機在天空中飛行”
3編寫主類,在main方法中:
建立3個Moveable型別的介面變數,分別引用Car、Ship、Aircraft類的物件。呼叫每個物件的move() 方法,觀察輸出結果
練習2(★★★★★)
見介面練習_動物王國。