接口的多實現和多繼承

注意

  • 接口中不允許有靜態代碼塊和構造方法(接口不能直接new)。

接口的多實現

在繼承體系中,一個類只能繼承一個父類,而對於接口而言,一個類是可以實現多個接口的。

這種叫做接口的多實現。一個類能繼承一個父類,且同時實現多個接口。

格式:

【】 :表示可選操作。

class 類名 【extends 父類名】 implements 接口名1,接口名2... {
	// 重寫接口中的抽象方法【可選】
	// 重寫接口中的默認方法【不重名時可選】
}

抽象方法重寫

接口中,有多個抽象方法時,實現類必須重寫所有抽象方法。如果抽象方法有重名,只需重寫一次

爸爸媽媽都讓去上學,說一次就行了

定義多個接口:

MyInterfaceA

public interface MyInterfaceA {
/*
    // error 接口不能有靜態代碼塊
    static { }

    // error 接口不能有構造方法(接口不能直接new)
    public MyInterface() {}
*/

    public abstract void methodA();

    public abstract void methodSchool();

}

MyInterfaceB

public interface MyInterfaceB {

    public abstract void methodB();

    public abstract void methodSchool();  
    }
}

定義實現類:

package cn.luis.demo2.I2;


public class MyInterfaceImpl /*extends Object*/ implements MyInterfaceA, MyInterfaceB {
    @Override
    public void methodA() {
        System.out.println("AAA");
    }

    @Override
    public void methodB() {
        System.out.println("BBB");
    }

    @Override
    public void methodSchool() {
        System.out.println("上學去!");
    }
}

默認方法重寫

接口中,有多個默認方法時,實現類都可繼承使用。如果默認方法有重名的,必須進行覆蓋重寫一次

例如:遊戲和女朋友選哪一個

定義多個接口:

MyInterfaceA

public interface MyInterfaceA {

    public default void methodDefault() {
        System.out.println("媽媽說:先做語文作業");
    }
}

MyInterfaceB

public interface MyInterfaceB {
    
    public default void methodDefault() {
        System.out.println("爸爸說:先做數學作業");
    }
}

定義實現類:

public class MyInterfaceImpl /*extends Object*/ implements MyInterfaceA, MyInterfaceB {
  
    @Override
    public void methodDefault() {  // 實現類覆蓋重寫默認方法不帶default【重要】
        //
        System.out.println("打遊戲!");
    }
}

靜態方法

接口中,存在同名的靜態方法並不會衝突,因爲只能通過各自接口名訪問靜態方法。

繼承優先於接口實現

若一個類直接父類(親爹)當中的方法,和接口中的默認方法重名,優先使用父類中的方法。

定義接口:

public interface MyInterface {

    public default void method() {
        System.out.println("打LOL");
    }
}

定義父類:

public class Fu {

    public void method() {
        System.out.println("玩CSGO");
    }
}

定義子類:

// 6.繼承優先於接口實現
public class Zi extends Fu implements MyInterface {
	// 未重寫method方法
}

定義測試類:

public class Demo01Interface {

    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.method();  // 父類方法
    }
}

結果:

玩CSGO

總結

接口是沒有靜態代碼塊或者構造方法的。

沒有構造方法意味着無法創建對象

一個類的直接父類是唯一的,但是一個類可以同時實現多個接口

public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {
 // 覆蓋重寫所有抽象方法
}

如果實現類所實現的多個接口當中,存在重複的抽象方法,那麼只需要重寫一次即可

爸爸媽媽都讓去上學,一次就行了

若實現類未覆蓋重寫所有接口當中所有的抽象方法,那麼實現類必須是一個抽象類

若實現類所實現的多個接口中,存在重複的默認方法,那麼實現類一定要對沖突的默認方法進行覆蓋重寫。

遊戲和女朋友選哪一個

如果一個類直接父類(親爹)當中的方法,和接口中的默認方法產生了衝突,優先使用父類中的方法。

繼承優先於接口實現

. 接口中,無法定義成員變量,但是可以定義常量,其值不可以改變,

默認使用public static final修飾。

實現類覆蓋重寫接口的默認方法不帶default關鍵字 【重要】

接口的多繼承

一個接口能繼承另一個或多個接口,這和類之間的繼承比較相似。接口的繼承使用extends關鍵字,子接口能繼承父接口的方法。

如果父接口中的默認方法重名,那麼子接口需要重寫一次。

定義父接口

MyInterfaceA

package cn.luis.demo3;

public interface MyInterfaceA {

    public abstract void methodA();
    public abstract void methodCommon();

    public default void methodDefault() {
        System.out.println("先喫雞蛋");
    }
}

MyInterfaceB

package cn.luis.demo3;

public interface MyInterfaceB {

    public abstract void methodB();
    public abstract void methodCommon();

    public default void methodDefault() {
        System.out.println("先喝粥");
    }
}

定義子接口

這個子接口當中有幾個方法? 答:4個

  • methodA()來源於接口A
  • methodB()來源於接口B
  • methodCommon()同時來源於接口A、B
  • methodZi()來源於自己
package cn.luis.demo3;

/*

 */
public interface MyInterfaceZi extends MyInterfaceA, MyInterfaceB {

    public abstract void methodZi();

    // 兩個父接口默認方法衝突
    @Override
    public default void methodDefault() {  // 子接口必須進行默認方法的重寫【default】
        System.out.println("methodDefault:聽我的,先喫油條");
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章