Java不支持多繼承性,即一個類只能有一個父類。單繼承性使得Java簡單,易於管理程序。爲了克服單繼承的缺點,Java使用了接口,一個類可以實現多個接口。
使用關鍵字interface來定義一個接口。分爲接口的聲明和接口體。
(1)接口聲明:接口通過使用關鍵字interface來聲明,格式:
interface 接口的名字
(2)接口體: 接口體中包含常量定義和方法定義兩部分。接口體中只進行方法的聲明,不許提供方法的實現,所以,方法的定義沒有方法體,且用分號“;”結尾 。
interface Printable{
final int MAX=100;
void add();
float sum(float x ,float y);
}
(3)接口的使用: 一個類通過使用關鍵字implements 聲明自己實現一個或多個接口。如果實現多個接口,用逗號隔開接口名,如:
class A implements Printable,Addable
如果一個類實現某個接口,那麼這個類必須實現該接口的所有方法,即爲這些方法提供方法體。
要注意的是,接口中的方法被默認是public和abstract的,接口在聲明方法時可以省略方法前面的public和abstract關鍵字,但是,類在實現接口方法時,一定要用public來修飾。
類實現的接口方法以及接口中的常量可以被類的對象調用。
如果父類實現了某個接口,則其子類也就自然實現這個接口。接口也可以被繼承,即可以通過關鍵字extends聲明一個接口是另一個接口的子接口。
一個類可以實現多個接口,接口可以增加很多類都需要實現的功能,不同的類可以使用相同的接口,同一個類也可以實現多個接口。
如,轎車、飛機、輪船等,可能也需要具體實現“收取費用”和“調節溫度”的功能,而它們的父類可能互不相同。
接口只關心功能,並不關心功能的具體實現,使用同一接口的類在實現接口中的方法時,可以給出不同的方法體。
如“客車類”實現一個接口,該接口中有一個“收取費用”的方法,那麼這個“客車類”必須具體給出怎樣收取費用的操作,即給出方法的方法體,不同車類都可以實現“收取費用”,但“收取費用”的手段可能不相同,這是功能“收取費用”的多態,即不同對象調用同一操作可能具有不同的行爲。
接口的思想在於它可以增加很多類都需要實現的功能,使用相同的接口類不一定有繼承關係。
接口回調
接口回調是多態的另一種體現。
1. 接口回調是指:可以把使用某一接口的類創建的對象的引用賦給該接口聲明的接口變量中,那麼該接口變量就可以調用被類實現的接口中的方法,當接口變量調用被類實現的接口中的方法時,就是通知相應的對象調用接口的方法,這一過程稱作對象功能的接口回調。接口回調可能產生不同的行爲。
interface ShowMessage{
void showTradeMark();
}
class TV implements ShowMessage{
public void showTradeMark(){
System.out.println("我是電視機");
}
}
class PC implements ShowMessage{
public void showTradeMark(){
System.out.println("我是電腦");
}
}
public class Example5_12{
public static void main(String args[]){
ShowMessage sm; //聲明接口變量sm
sm=new TV(); //接口變量sm中存放對象的引用
sm.showTradeMark(); //接口sm回調showTradeMark()方法
sm=new PC(); //接口變量sm中存放對象的引用
sm.showTradeMark(); //接口回調
}
}
2.接口做參數
當一個方法的參數是一個接口類型時,如果一個類實現了該接口,那麼就可以把該類的實例的引用傳值給該參數,參數可以回調類實現的接口方法。
interface Show{
void show();
}
class A implements Show{
public void show(){
System.out.println("I love This Game");
}
}
class B implements Show{
public void show(){
System.out.println("我喜歡看NBA");
}
}
class C{
public void f(Show s){ //接口作爲參數
s.show();
}
}
public class Example5_13{
public static void main(String args[]){
C c=new C();
c.f(new A());
c.f(new B());
}
}