注意
- 接口中不允許有靜態代碼塊和構造方法(接口不能直接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()
來源於接口AmethodB()
來源於接口BmethodCommon()
同時來源於接口A、BmethodZi()
來源於自己
package cn.luis.demo3;
/*
*/
public interface MyInterfaceZi extends MyInterfaceA, MyInterfaceB {
public abstract void methodZi();
// 兩個父接口默認方法衝突
@Override
public default void methodDefault() { // 子接口必須進行默認方法的重寫【default】
System.out.println("methodDefault:聽我的,先喫油條");
}
}