1. 程式人生 > 實用技巧 >[Java SE]Java8新特性——預設方法

[Java SE]Java8新特性——預設方法

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

X 參考文獻