1. 程式人生 > 其它 >06 介面Interface

06 介面Interface

技術標籤: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();
    }
}