[Java SE]Java8新特性——預設方法
阿新 • • 發佈:2020-10-12
1 簡述
預設方法(default void hello()) := 一個在接口裡面有了一個(預設)實現的方法
1. 子類優先繼承父類的方法。 如果父類沒有相同簽名的方法: #1 子類才繼承介面的預設方法; #2 若子類實現了2個及以上的相同簽名預設方法的介面時: 在子類中必須/強制 Override(重寫) 預設方法; 否則,報編譯錯誤 (因為:此時編譯器無法判別,該呼叫哪個介面的預設方法) 如果父類中存在相同簽名的方法: #1 子類繼承父類相同簽名的方法; #2 不論何種情況: 子類中不必再強制 Override(重寫) 預設方法
易錯的使用場景:繼承 或 實現具有相同預設方法的父類或介面問題
2 程式碼示例
interface A
public interface A {
String hi();
String greet();
default void hello() {
System.out.println("A.hello");
}
}
interface B
public interface B { String hi(); String hh(); default void hello() { System.out.println("B.hello"); } }
class D
public class D {
public void hello() {//與介面 A / B 存在相同簽名的方法
System.out.println("D.hello");
}
}
class C
- 情況1: public class C extends D implements A, B
public class C extends D implements A, B{ @Override public String hi() { return "C.hi"; } @Override public String greet() { return "C.greet"; } @Override public String hh() { return "C.hh"; } /* 預設方法(default void hello()) := 一個在接口裡面有了一個實現的方法 1. 子類優先繼承父類的方法。 如果父類沒有相同簽名的方法: #1 子類才繼承介面的預設方法; #2 若子類實現了2個及以上的相同簽名預設方法的介面時: 在子類中必須/強制 Override(重寫) 預設方法; 否則,報編譯錯誤 如果父類中存在相同簽名的方法: #1 子類繼承父類相同簽名的方法; #2 不論何種情況: 子類中不必再強制 Override(重寫) 預設方法 */ /** * 重寫 預設方法 * 若子類不處理預設方法hello時,類C將編譯出錯,解決方式: 要麼重新覆蓋,要麼指定實現父介面的該方法 * 編譯報錯解決1:完全覆蓋法 */ /* @Override public void hello() { System.out.println("C.hello"); }*/ /** * 重寫 預設方法 * 編譯報錯解決2:指定實現的父介面 */ /* @Override public void hello() { A.super.hello(); B.super.hello(); }*/ }
- 情況2: public class C implements A, B
- 情況3: public class C implements A