接口是多個類的公共規範,接口是一種引用資料類型,最重要的内容是其中的抽象方法
定義一個接口的格式
public interface 接口名稱 {
// 接口内容
}
備注:換成了關鍵字interface之後,編譯生成的位元組碼檔案仍然是.java->.class
如果是java 7,那麼接口中可以包含的内容有:
1.常量
2.抽象方法
如果是java 8 ,還可以包含有:
3.預設方法
4.靜态方法
如果是java 9,還可以包含有:
5.私有方法
接口使用步驟:
1.接口不能直接使用,必須有一個“實作類”來“實作”該接口
格式:
public class 實作類名稱 implements 接口名稱{…}
2.接口的實作類必須覆寫重寫(實作)接口中所有的抽象方法
實作:去掉abstract關鍵字,加上方法體大括号
3.建立實作類的對象,進行使用
注意事項:
如果實作類并沒有覆寫重寫接口中所有的抽象方法,那麼這個實作類自己就必須是抽象類
抽象接口
/*
在任何版本的java中,接口都能定義抽象方法
格式:
public abstract 傳回值類型 方法名稱(參數清單);
注意事項:
1.接口當中的抽象方法,修飾符必須是兩個固定的關鍵字:public abstract
2.這兩個關鍵字修飾符,可以選擇性的省略
3.方法的三要素可以随意定義
*/
public interface MyInterfaceAbstract {
//這是一個抽象方法
public abstract void methodAbs();
//這也是抽象方法
abstract void methodAbs2();
public void methodAbs3();
void methodAbs4();
}
public class MyInterfaceAbstractImpl implements MyInterfaceAbstract {
@Override
public void methodAbs() {
System.out.println("方法");
}
}
public static void main(String[] args) {
//錯誤寫法,不能直接new接口對象使用
//MyInterfaceAbstract inter = new MyInterfaceAbstract();
//建立實作類的對象使用
MyInterfaceAbstractImpl impl=new MyInterfaceAbstractImpl();
impl.methodAbs();
}
接口中添加新的方法時可以用預設方法
1.接口的預設方法可以通過接口實作類對象直接調用
2.接口的預設方法,也可以被接口實作類進行覆寫重寫
public interface MyInterfaceDefault {
public abstract void methodAbs();
//新添加了一個抽象方法會導緻實作報錯
//public abstract void methodAbs2();
//新添加的方法,改成預設方法,public可以不寫,default不能省略,就不報錯了
public default void methodDefault(){
System.out.println("這是新添加的預設方法");
}
}
不重寫的
public class MyInterfaceDefaultA implements MyInterfaceDefault {
@Override
public void methodAbs() {
System.out.println("實作了抽象方法AAA");
}
}
重寫的
public class MyInterfaceDefaultB implements MyInterfaceDefault {
@Override
public void methodAbs() {
System.out.println("實作了抽象方法BBB");
}
@Override
public void methodDefault(){
System.out.println("實作類B覆寫重寫了default方法");
}
}
public static void main(String[] args) {
//建立了實作類對象
MyInterfaceDefaultA a=new MyInterfaceDefaultA();
a.methodAbs();//調用抽象方法,實際運作的是右側實作類
//調用預設方法,如果實作類當中沒有,會向上找接口
a.methodDefault();
MyInterfaceDefaultB b=new MyInterfaceDefaultB();
b.methodAbs();
b.methodDefault();
}
結果:
實作了抽象方法AAA
這是新添加的預設方法
實作了抽象方法BBB
實作類B覆寫重寫了default方法
接口中的靜态方法
不能通過接口實作類的對象來調用接口當中的靜态方法
正确用法:通過接口名稱,直接調用其中的靜态方法
格式:
接口名稱.靜态方法名(參數)
public static void main(String[] args) {
//建立了實作類對象。其實隻引用靜态方法都不用建立
MyInterfaceStaticImpl impl=new MyInterfaceStaticImpl();
//錯誤寫法
//impl.methodStatic();
//直接通過接口名稱調用靜态方法
MyInterfaceStatic.methodStatic();
}
靜态接口
/*
從java8開始,接口當中允許定義靜态方法
格式:
public static 傳回值類型 方法名稱(參數清單){方法體}
就是把abstract或者default換成static即可,帶上方法體
*/
public interface MyInterfaceStatic {
public static void methodStatic(){
System.out.println("這是接口的靜态方法");
}
}
實作
接口中有方法使用同樣的内容時可以用私有方法,靜态就都加上static,也可以用
public interface MyInterfacePrivateA {
public default void methodDefault1(){
System.out.println("預設方法1");
methodCommon();
}
public default void methodDefault2(){
System.out.println("預設方法2");
methodCommon();
}
private void methodCommon(){
System.out.println("AAA");
System.out.println("BBB");
System.out.println("CCC");
}
}
public interface MyInterfacePrivateB {
public static void methodDefault1(){
System.out.println("靜态方法1");
methodStaticCommon();
}
public static void methodDefault2(){
System.out.println("靜态方法2");
methodStaticCommon();
}
private static void methodStaticCommon(){
System.out.println("AAA");
System.out.println("BBB");
System.out.println("CCC");
}
}
public static void main(String[] args) {
MyInterfacePrivateB.methodDefault1();
//錯誤寫法,private不能直接通路
//MyInterfacePrivateB.methodCommon();
MyInterfacePrivateAImpl impl= new MyInterfacePrivateAImpl();
impl.methodDefault1();
}
接口中的常量
接口當中也可以定義“成員變量”,但是必須使用public static final三個關鍵字進行修飾
從效果上看,這其實就是接口的【常量】
格式:
public static final 資料類型 常量名稱=資料值;
備注:一旦使用final關鍵字進行修飾,說明不可改變
注意事項:
1.接口中的常量,可以省略public static final,但一樣生效
2.接口當中的常量,必須進行指派,不能不指派
3.接口中常量的名稱,使用完全大寫的字母,用下劃線進行分隔
public interface MyInterfaceconst {
//常量,一旦指派不可修改
public static final int NUM=10;
}
public static void main(String[] args) {
System.out.println(MyInterfaceconst.NUM);
}
在java9+版本中,接口的内容可以有
1.成員變量其實是常量,格式:
[public] [static] [final]數值類型 常量名稱=資料值;
注意:
常量必須進行指派,而且一旦指派不能改變
常量名稱完全大寫,用下劃線進行分隔
2.接口中最重要的就是抽象方法,格式:
[public] [abstract] 傳回值類型 方法名稱(參數清單);
注意:實作類必須覆寫重寫接口所有的抽象方法,除非實作類是抽象類
3.從java8開始,接口裡允許定義預設方法,格式:
[public] default 傳回值類型 方法名稱(參數清單){方法體}
注意:預設方法也可以被覆寫重寫
4.從java8開始,接口裡允許定義靜态方法,格式:
[public]static 傳回值類型 方法名稱(參數清單){方法體}
注意:應該通過接口名稱進行調用,不能通過實作類對象調用接口靜态方法
5.從java9開始,接口裡允許定義私有方法,格式:
普通私有方法:private 傳回值類型 方法名稱(參數清單){方法體}
靜态私有方法:private static 傳回值類型 方法名稱(參數清單){方法體}
注意:private的方法隻有接口才能調用,不能被實作類或别人調用
改名shift+f6
使用接口的時候需要注意:
1.接口是沒有靜态代碼塊或構造方法
2.一個類的直接父類是唯一的,但是一個類可以同時實作多個接口
格式:
public class MyInterfaceImpl implements MyInterfaceA,MyInterfaceB{
//覆寫重寫所有抽象方法}
3.如果實作類所實作的多個接口當中存在重複的抽象方法,那麼隻需要覆寫重寫一次
4.如果實作類沒有覆寫重寫所有接口當中的所有抽象方法,那麼實作類就必須是一個抽象類
5.如果實作類所實作的多個接口當中,存在重複的預設方法,那麼實作類一定要對沖突的預設方法進行覆寫重寫
6.一個類如果直接父類當中的方法和接口當中的方法産生了沖突,優先用父類當中的方法
6.例子
public static void main(String[] args) {
Son son=new Son();
son.method();
}
public class Father {
public void method(){
System.out.println("父類方法");
}
}
public class Son extends Father implements MyInterface{
}
public interface MyInterface {
public default void method(){
System.out.println("接口的預設方法");
}
}
結果:父類方法
1.類與類之間是單繼承的,直接父類隻有一個
2.類與接口之間是多實作的,一個類可以實作多個接口
3.接口與接口之間是多繼承的
注意事項:
1.多個父接口當中的抽象方法可以重複
2.多個父接口當中的預設方法不能重複,如果重複,子接口必須帶着default關鍵字進行預設方法的覆寫重寫
public interface MyInterface extends MyInterfaceA,MyInterfaceB {
public abstract void method();}
一個類隻能extends一個父類,但可以implements多個接口。
一個接口則可以同時extends多個接口,卻不能implements任何接口。
Java中的接口是支援多繼承的。