介面不能創建對象,但是可以被實現(`implements` ,類似於被繼承)。一個實現介面的類(可以看做是介面的子類),需要實現介面中所有的抽象方法,創建該類對象,就可以調用方法了,否則它必須是一個抽象類。 介面:是功能的集合(介面中定義的都是方法) 定義介面使用的也是.java文件;編譯生成的也是 ...
介面不能創建對象,但是可以被實現(`implements` ,類似於被繼承)。一個實現介面的類(可以看做是介面的子類),需要實現介面中所有的抽象方法,創建該類對象,就可以調用方法了,否則它必須是一個抽象類。
介面:是功能的集合(介面中定義的都是方法)
定義介面使用的也是.java文件;編譯生成的也是.class文件
定義介面使用關鍵字interface
修飾符 interface 介面名 {
抽象方法;
預設方法; (JDK8以後新增)
靜態方法; (JDK8以後新增)
}
介面的使用:
1.介面不能創建對象使用
2.可以定義一個實現類,實現(繼承)介面,重寫介面中的抽象方法,創建實現類對象使用
抽象方法:沒有方法體,被abstract修飾的方法
預設的修飾符public abstract可以省略
public abstract 返回值類型 方法名(參數);
註意:
介面中的抽象方法修飾符是可以省略不寫,不寫預設也是public abstract
建議寫出,增強閱讀性
public interface MyInter {
//定義抽象方法
public abstract void show01();
public abstract int show02();
void show03(String s);
}
定義介面的實現類
使用格式:使用類實現介面,重寫介面中的抽象方法
public class 實現類名 implements 介面{
重寫介面中的抽象方法;
}
註意:
實現類似於繼承,類實現介面,就可以繼承介面中的所有非私有的成員
public class MyInterImpl implements MyInter{
@Override
public void show01() {
System.out.println("實現類重寫介面中的show01抽象方法!");
}
@Override
public int show02() {
System.out.println("實現類重寫介面中的show02抽象方法!");
return 0;
}
@Override
public void show03(String s) {
System.out.println("實現類重寫介面中的show03抽象方法!"+s);
}
}
public class Demo01MyInter {
public static void main(String[] args) {
//介面不能創建對象使用 'MyInter' is abstract; cannot be instantiated
//MyInter mi = new MyInter();
//創建介面的實現類對象
MyInterImpl my = new MyInterImpl();
my.show01();
my.show02();
my.show03("趙四");
}
}
預設方法
定義格式:
修飾符 default 返回值類型 方法名(參數){
方法體;
}
註意:
預設方法的修飾符default不能省略
public interface MyInter {
public default void show01(){
System.out.println("MyInter介面中的預設show01方法");
}
public default void show02(){
System.out.println("MyInter介面中的預設show02方法");
}
}
- 含有預設方法的介面的使用:定義實現類,實現介面,選擇性的重寫預設方法,創建實現類對象使用
- 重寫了預設方法:使用實現類重寫後的方法
- 沒有重寫預設方法:使用繼承自介面中的預設方法
註意:
實現類重寫介面中的預設方法,去掉default修飾符
public class MyInterImpl implements MyInter{
@Override
public void show01() {
System.out.println("實現類重寫了MyInter介面中的show01預設方法");
}
}
public class Demo01MyInter {
public static void main(String[] args) {
//創建介面的實現類對象
MyInterImpl my = new MyInterImpl();
my.show01();//實現類重寫的
my.show02();//繼承自介面的
}
}
靜態方法
定義格式:
修飾符 static 返回值類型 方法名(參數){
方法體
}
註意:
-
-
-
- 定義靜態方法不能省略static關鍵字
- 定義含有靜態方法的介面使用:
- 靜態成員屬於類(介面),所以可以通過介面名.方法名(參數)直接使用
-
-
public interface MyInter {
public static void show01(){
System.out.println("MyInter介面的靜態show01方法");
}
public static String show02(int a){
System.out.println("MyInter介面的靜態show01方法"+a);
return "哈哈";
}
}
public class MyInterImpl implements MyInter{
//@Override//Method does not override method from its superclass
public static void show01(){
System.out.println("MyInterImpl類的靜態show01方法");
}
}
靜態方法只能使用介面名調用,不可以通過實現類的類名或者實現類的對象調用
靜態方法是不能重寫的,屬於類|介面本身,也不能被實現類繼承使用。在實現類中定義了靜態方法,屬於實現類本身
public class Demo01MyInter {
public static void main(String[] args) {
//通過介面名.方法名(參數)調用介面中的靜態方法
MyInter.show01();
String s = MyInter.show02(10);
System.out.println(s);
MyInterImpl.show01();
}
}
介面的多實現
語法
class 類名 [extends 父類名] implements 介面名1,介面名2,介面名3... {
// 重寫介面中抽象方法【必須】
// 重寫介面中預設方法【不重名時可選】
}
抽象方法
介面中,有多個抽象方法時,實現類必須重寫所有抽象方法。如果多個介面中抽象方法有重名的,只需要重寫一次。
預設方法
介面中,有多個預設方法時,實現類都可繼承使用。如果預設方法有重名的,必須重寫一次。
靜態方法
介面中,存在同名的靜態方法並不會衝突,原因是只能通過各自介面名訪問靜態方法。
優先順序的問題
當一個類,既繼承一個父類,又實現若幹個介面時,父類中的成員方法與介面中的預設方法重名,子類就近選擇執行父類的成員方法。
介面的多繼承
- 介面的繼承使用 `extends` 關鍵字,子介面繼承父介面的方法。如果多個父介面中的預設方法有重名的,那麼子介面需要重寫一次
- 子介面重寫預設方法時,default關鍵字可以保留。
- 子類重寫預設方法時,default關鍵字不可以保留。
其他成員的特點
- 介面中,無法定義成員變數,但是可以定義常量,其值不可以改變,預設使用public static final修飾。
- 介面中,沒有構造方法,不能創建對象。
- 介面中,沒有靜態代碼塊。
抽象類和介面
- 一個類只能繼承一個直接父類(可能是抽象類),卻可以實現多個介面, 介面彌補了Java的單繼承
- 抽象類為繼承體系中的共性內容, 介面為繼承體系中的擴展功能