接口interface
接口可以理解為一種更為抽象的抽象類,是抽象類的一種特殊形式,抽象類中可以定義不是抽象方法的一般方法(有方法體的方法),可以讓子類直接繼承使用,而接口中只能定義抽象方法,不能有一般方法,只能創建子類子類實例化使用。
接口的定義
接口也是一種特殊的類,但是接口的定義關鍵字不是class,需要用interface(接口)關鍵字來定義
定義格式:
public interface 接口名{
抽象方法1;
抽象方法2;
抽象方法3;
……
}
接口中的抽象方法也是有固定的定義格式的:
public abstract 返回值類型 方法名(參數列表);
接口方法的修飾符必須為
接口的成員變量的定義也是有要求的:
public static final(最終的) 數據類型 變量名 = 值;
接口中定義的成員變量全部都是常量,定義後就不可改變。
類實現接口
類與類之間是繼承的關系,子類繼承了父類,類與接口之間就不是繼承關系了,而是實現關系,類實現了接口,這個類可以看成是子類,準確來說應該是實現類。
定義了接口,就需要定義另一個類去實現這個接口,重寫接口的方法,需要用到一個關鍵字implements(實現)去實現接口,用一段代碼來演示接口的實現:
l 接口類
package cn.itcast.intreface接口; /* * 定義接口 * 定義成員變量和抽象方法 */ public interface Interface { //定義成員變量,其實在接口中定義的變量都是常量 //int a = 1; //寫全之後是這種格式 public static final int a = 1; //定義抽象方法,用於實現類的方法重寫 public abstract void fuction(); }
l 實現接口類
package cn.itcast.intreface接口; /* * 實現類,實現接口 * 重寫接口的方法 */ public class ImplementsInterface implements Interface{ //重寫接口方法 public void fuction(){ System.out.println("類重寫了接口中的方法"); } }
l 測試類
package cn.itcast.intreface接口; /* * 測試類;測試接口的實現 */ public class Test { public static void main(String[] args) { //創建實現接口類ImplementsInterface的對象 ImplementsInterface imp = new ImplementsInterface(); imp.fuction(); } }
接口中成員的特點
1、成員變量的特點:其實在接口中該變量已經不是變量了,而是常量,它的值是不可以被改變的。
成員變量的定義格式(固定):public static final 數據類型 變量名 = 值;
public 權限最大
static 被static修飾的成員都可以通過類名點直接調用該成員
final 最終的,被它修飾的成員不可被修改
註意:這三個修飾符可寫可不寫,它都是默認存在的。
2、成員方法的特點:
抽象方法的格式(固定):public abstract 返回值類型 方法名();
接口中方法的public abstract 修飾符也是可寫可不寫,都是默認存在的。
註意:接口中的抽象方法,在實現類中必須全部進行重寫。
接口的多實現
在java中是不允許多繼承的,但是可以允許接口的多實現,定義兩個接口,實現類繼承兩個接口,這是允許的,但是必須要將兩個接口中的抽象方法全部進行重寫。如下:
//接口A
public interface A{
public abstract void a();
}
//接口B
public interface B{
public abstract void b();
}
//實現類C,進行多實現,重寫接口中的所有方法
public class C implements A,B{
public void a(){}
public void b(){}
}
類繼承類實現多接口
一個類可以繼承一個父類同時實現多個接口,如下:
//接口A
public interface A{
public abstract void a();
}
//接口B
public interface B{
public abstract void b();
}
//父類D
public class D{
public void d(){}
}
//實現類C,進行多實現,重寫接口中的所有方法
public class C extends D implements A,B{
public void a(){}
public void b(){}
public void d(){}
}
接口中的多繼承
java中類之間是不能有多繼承的,但是接口之間可以進行多繼承,如下:
//接口A
public interface A{
public abstract void a();
}
//接口B
public interface B{
public abstract void b();
}
/*
接口C,繼承接口A,B
重寫接口中所有的方法
*/
public interface C entends A,B{
public void a(){}
public void b(){}
}
接口的好處
1、 增強了擴展性
2、 借口就是暴露出來的規則
3、 接口降低了耦合性
接口和抽象類的區別
相同點:
1、 都屬於繼承的頂端被其他類繼承或者實現
2、 都需要重寫其父類和接口的方法
3、 接口和抽象類都不能實例化對象,需要子類重寫方法創建子類對象進行實現
區別:
1、 抽象類可以重寫一部分方法,其他方法可以直接繼承使用,接口必須重寫所有的方法
2、 一個類只能繼承一個直接父類,但是接口可以實現多個,解決了單繼承的問題
3、 抽象類是這個事物應該具備的功能,接口是這個事物可以具備的額外功能
二者優先考慮接口的使用,需要為子類提供共性的內容選擇抽象類
接口interface