06 介面Interface
阿新 • • 發佈:2021-02-01
技術標籤:java
文章目錄
介面
定義
介面是一種引用型別,是抽象方法的集合,是多個類的規範
介面的使用,它不能建立物件,但是可以被實現( implements ,類似於被繼承)。一個實現介面的類(可以看做 是介面的子類),需要實現介面中所有的抽象方法,建立該類物件,就可以呼叫方法了,否則它必須是一個抽象 類。
public interface 介面名稱 { // 抽象方法 // 預設方法 // 靜態方法 // 私有方法 }
介面抽象方法
使用 abstract 關鍵字修飾,可以省略,沒有方法體。該方法供子類實現使用
public abstract 返回值型別 方法名稱(引數列表);
- 定義介面
public interface Test {
// 抽象方法
public abstract void method01();
public abstract void method02();
}
注意事項
1.抽象方法必須全部實現
2.介面當中的抽象方法,修飾符必須是兩個固定的關鍵字: public abstract
3.這倆個關鍵字修飾符,可以選擇性地省略
4.方法的三要素: 可以隨意定義
介面預設方法
使用 default 修飾,不可省略,供子類呼叫或者子類重寫。
可以繼承,可以重寫,二選一,但是隻能通過實現類的物件來呼叫。
public default 返回值型別 方法名稱(引數列表){
// 方法體
}
注意
- 介面當中的預設方法,可以解決介面升級的問題
介面靜態方法
使用 static 修飾,供介面直接呼叫。
介面私有方法
使用 private 修飾,供介面中的預設方法或者靜態方法呼叫。
靜態與.class 檔案相關,只能使用介面名呼叫,不可以通過實現類的類名或者實現類的物件呼叫
- 私有方法:只有預設方法可以呼叫。
- 私有靜態方法:預設方法和靜態方法可以呼叫。
public interface 介面名稱 {
// 抽象方法
public abstract void method01();
// 預設方法
public default void method02() {
// 執行語句
}
// 靜態方法
public static void method3() {
// 執行語句
}
// 私有方法
private void method() {
// 執行語句
}
}
使用
1.介面不能直接使用,必須有一個"實現類"來"實現"該介面
public class 實現類名稱 implements 介面名稱{
// 重寫介面中抽象方法【必須】
// 重寫介面中預設方法【可選】
}
2.介面的實現類必須覆蓋重寫(實現)介面中所有的抽象方法
- 去掉abstract關鍵字,加上方法體大括號
3.建立實現類的物件,進行使用
注意事項
如果實現類並沒有覆蓋重寫介面中所有的抽象方法,那麼這個實現類自己就必須是抽象類
演示
- 定義介面
public interface Test {
// 抽象方法
public abstract void method01();
// 預設方法
public default void method02() {
// 執行語句
}
// 靜態方法
public static void method3() {
System.out.println("靜態方法執行");
}
// 私有方法
private void method() {
System.out.println("私有方法執行");
}
}
- 定義實現類
public class Implement implements Test {
// 重寫抽象方法
@Override
public void method01(){
System.out.println("抽象方法執行");
};
// 預設方法
// 方法一
// 繼承,什麼都不用寫,直接呼叫
// 方法二
// 重寫預設方法
public void method02() {
System.out.println("新的預設方法執行");
}
// 無需重寫靜態方法
}
- 測試類
public class InterfaceDemo {
public static void main(String[] args) {
// 建立子類物件
Implement test = new Implement();
// 呼叫實現後的抽象方法
test.method01();
// 呼叫預設方法
test.method02();
// 呼叫預設方法(通過介面)
Test.method3();
// 私有方法,外部無法呼叫
}
}
/*
抽象方法執行
新的預設方法執行
靜態方法執行
*/
介面的多實現
對於介面而言,一個類是可以實現多個介面的
class 類名 [extends 父類名] implements 介面名1,介面名2,介面名3... {
// 重寫介面中抽象方法【必須】
// 重寫介面中預設方法【不重名時可選】
}
抽象方法
介面中,有多個抽象方法時,實現類必須重寫所有抽象方法。如果抽象方法有重名的,只需要重寫一次
預設方法
介面中,有多個預設方法時,實現類都可繼承使用。如果預設方法有重名的,必須重寫一次
靜態方法
介面中,存在同名的靜態方法並不會衝突,原因是隻能通過各自介面名訪問靜態方法。
演示
- 定義多個介面
public interface A {
// 抽象方法
public abstract void showA();
public abstract void show();
// 預設方法
public default void methodA(){
System.out.println("A的預設方法執行");
};
public default void method(){};
}
public interface B {
// 抽象方法
public abstract void showB();
public abstract void show();
// 預設方法
public default void methodB(){
System.out.println("B的預設方法執行");
};
public default void method(){};
}
- 實現類
public class C implements A, B{
// 重寫A的抽象方法showA()
@Override
public void showA() {
System.out.println("A的抽象方法showA()執行");
}
// 重寫B的抽象方法showB()
@Override
public void showB() {
System.out.println("B的抽象方法showB()執行");
}
// A和B有個同名抽象方法show(),只需重寫一次
@Override
public void show() {
System.out.println("A和B的同名抽象方法show()執行");
}
// A和B的不同命預設方法可以繼承可以重寫
@Override
public void methodB() {
}
@Override
public void methodA() {
}
// A和B的同名預設方法必須重寫
@Override
public void method() {
System.out.println("A和B的同名預設方法method()執行");
}
}
- 測試類
public class Test extends C{
public static void main(String[] args) {
// 建立子類物件
Test test = new Test();
// 呼叫實現後的抽象方法
test.showA();
test.showB();
test.show();
// 呼叫預設方法
test.methodA();
test.methodB();
test.method();
// 呼叫靜態方法
A.StaticMethod();
B.StaticMethod();
}
}