接口概述
接口也是一種規范
接口的定義與特點
接口的格式如下:
//接口用關鍵字interface來定義
public interface 接口名 {// 常量// 抽象方法
}
JDK8之前接口中只能是抽象方法和常量,沒有其他成分了。
接口不能實例化。
接口中的成員都是public修飾的,寫不寫都是,因為規范的目的是為了公開化。?
示例:?
public interface SportManInterface {// 接口中的成員:JDK 1.8之前只有常量 和 抽象方法// public static final 可以省略不寫,接口默認會為你加上!// public static final String SCHOOL_NAME = "黑馬";String SCHOOL_NAME = "黑馬";// 2、抽象方法// public abstract 可以省略不寫,接口默認會為你加上!// public abstract void run();void run();// public abstract void eat();void eat();
}
接口的基本使用:被實現
接口是用來被類實現(implements)的,實現接口的類稱為實現類。
實現類可以理解成所謂的子類。
修飾符 class 實現類 implements 接口1, 接口2, 接口3 , ... {
}
//實現的關鍵字:implements
從上面可以看出,接口可以被類單實現,也可以被類多實現。
示例:
/**實現類(子類)*/
public class PingPongMan implements SportMan , Law{private String name;public PingPongMan(String name) {this.name = name;}@Overridepublic void rule() {System.out.println(name + "要遵章守法,不能隨意外出,酗酒,約會~~~");}@Overridepublic void run() {System.out.println(name + "必須要跑步訓練~~");}@Overridepublic void competition() {System.out.println(name + "需要參加國際比賽~~");}
}
接口實現的注意事項: 一個類實現接口,必須重寫完全部接口的全部抽象方法,否則這個類需要定義成抽象類。
接口與接口的關系:多繼承
基本小結
類和類的關系:單繼承。
類和接口的關系:多實現。
接口和接口的關系:多繼承,一個接口可以同時繼承多個接口。
接口多繼承的作用
規范合并,整合多個接口為同一個接口,便于子類實現。
JDK8開始接口新增方法
JDK8版本開始后,Java只對接口的成員方法進行了新增。
原因如下:
項目Version2.0需要對Inter接口豐富,加入10個新的抽象方法,此時改了接口就要所有實現類實現這些方法。
如何能在豐富接口功能的同時 又不對子類代碼進行更改呢?
允許接口中直接定義帶有方法體的方法,那么子類就無需實現新的方法。?
第一種:默認方法
類似之前寫的普通實例方法:必須用default修飾 默認會public修飾。需要用接口的實現類的對象來調用。
default void run(){System.out.println("--開始跑--");
}
第二種:靜態方法
默認會public修飾,必須static修飾。
注意:接口的靜態方法必須用本身的接口名來調用。
static void inAddr(){System.out.println("我們都在黑馬培訓中心快樂的學習Java!");
}
第三種:私有方法
就是私有的實例方法:,必須使用private修飾,從JDK 1.9才開始有的。
只能在本類中被其他的默認方法或者私有方法訪問。
private void go(){System.out.println("--準備--");
}
總結
JDK8開始后新增了那些方法?
默認方法:default修飾,實現類對象調用。
靜態方法:static修飾,必須用當前接口名調用
私有方法:private修飾,jdk9開始才有的,只能在接口內部被調用。
他們都會默認被public修飾。?
注意:JDK8新增的3種方法我們自己在開發中很少使用,通常是Java源碼涉及到的,我們需要理解、識別語法、明白調用關系即可。
使用接口的注意事項
1、接口不能創建對象
2、一個類實現多個接口,多個接口中有同樣的靜態方法不沖突。
3、一個類繼承了父類,同時又實現了接口,父類中和接口中有同名方法,默認用父類的。
4、一個類實現了多個接口,多個接口中存在同名的默認方法,不沖突,這個類重寫該方法即可。 5、一個接口繼承多個接口,是沒有問題的,如果多個接口中存在規范沖突則不能多繼承。
下面的代碼就存在規范沖突,兩個run的返回值不一樣。
//interface AAA{
// int run();
//}
//interface BBB{
// void run();
//}
//
//interface CCC extends AAA, BBB{
//}