iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
自我挑戰組

從免費網路資源中入門java系列 第 18

【Day18】Java - interface 介面

  • 分享至 

  • xImage
  •  

介面是類別的藍圖,和抽象類別有點相似,以下是介面的特性:

  1. 介面裡不能有建構式,畢竟介面是無法被實例化的,介面僅能被類別實現(利用implements關鍵字)。
  2. 類別可以多重實現介面(在implements後的多個interface之間加上,)。
  3. 介面中的方法預設為抽象方法,在 Java 8 之前,介面中的所有方法都必須是抽象方法。
  4. 介面中的具體方法:自 Java 8 開始,介面可以有具體方法(使用 defaultstatic 關鍵字),而不僅限於抽象方法。
  • default 方法:當希望介面提供一個預設的行為給實作該介面的類別時,可以使用 default 關鍵字來定義具體的方法,實作的類別可以選擇是否要覆寫這個方法。
  • static 方法static 關鍵字用來宣告靜態方法,static屬於介面本身,不能被實作的類別覆寫,只能透過介面名稱來調用
  1. 介面中的變數只能是 public static final ,也就是常數,Java 會隱式地將介面中的變數設為這三個修飾詞,所以即使不顯式加上,它們仍然是 public static final

範例:

public interface Animal {
    void eat();           // 抽象方法
    void sleep();         // 抽象方法
    static void sound() { // 靜態方法
        System.out.println("Animal makes a sound.");
    }
}
public class Dog implements Animal {
    @Override
    public void eat() {        // 將抽象方法具體實現
        System.out.println("Dog is eating.");
    }

    @Override
    public void sleep() {     // 將抽象方法具體實現
        System.out.println("Dog is sleeping.");
    }
}
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();  // 輸出: Dog is eating.
        dog.sleep(); // 輸出: Dog is sleeping.

        // 透過介面調用靜態方法
        Animal.sound(); // 輸出: Animal makes a sound.
    }
}

延續上述範例,讓類別多重實現介面

public interface Flyable {
    void fly();
}

public class Bird implements Animal, Flyable {
    @Override
    public void eat() {
        System.out.println("Bird is eating.");
    }

    @Override
    public void sleep() {
        System.out.println("Bird is sleeping.");
    }

    @Override
    public void fly() {
        System.out.println("Bird is flying.");
    }
}

何時使用抽象類別,何時使用介面?

  • 如果你希望為一群相關的類別提供共通的行為或屬性(狀態),並且希望部分行為有預設實作,那麼應該使用抽象類別。
  • 如果你希望定義一組行為,而這些行為可以由完全不相關的類別來實作,並且你不需要提供任何具體實作,那麼應該使用介面。例如:「可飛行的能力」,無論是鳥類、飛機還是竹蜻蜓,都可以實作這個行為,但不提供具體實作,這時就可以用介面。
  • 當你需要實現讓物件具有多種型態時,使用介面會更合適,因為Java的Class有單一繼承的限制(一個子類別只能繼承一個父類別),但一個類別卻可以實作(implements)多個介面。

上一篇
【Day17】Java - 抽象類別
下一篇
【Day19】Java的存取修飾子(Access Modifiers)
系列文
從免費網路資源中入門java30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言