介面和抽象類別是實現抽象和多態性的基本元件。
Java中的介面是一種參考類型,類似類,只能包含抽象方法、靜態方法、預設方法和靜態最終變數(常數)。 Java 中介面用於實作抽象和多重繼承。接口不能直接實例化。
?在 Java 8 之前,介面只能有 抽象方法。
這些方法的實作必須在單獨的類別中提供。因此,如果要在介面中新增方法,則必須在實作相同介面的類別中提供其實作程式碼。
? 為了解決這個問題,Java 8引入了預設方法的概念,它允許介面擁有具有實現的方法,而不會影響實現該介面的類別.
如果需要,可以透過實作類別來覆寫預設方法。
Java中的抽象類別是不能自行實例化的類,可以包含抽象方法(沒有主體的方法)和具體方法(有主體的方法)。抽象類別用於為子類別提供公共基礎,允許程式碼重複使用和共享行為的定義。
Java只支援單繼承,也就是每個類別只能繼承一個類別的欄位和方法。如果您需要從多個來源繼承屬性,Java 提供了介面的概念,它是多重繼承的一種形式。
?介面與類別類似。但是,它們僅定義方法的簽名,而不定義其實作。接口中聲明的方法在類別中實作。 多重繼承當一個類別實作多個介面時就會發生。
在Java中,多重繼承是透過介面而不是類別來實現的。這允許一個類別實作多個接口,並從每個接口繼承方法簽名。下面是一個使用介面示範多重繼承的範例。
讓我們定義兩個接口,Flyable 和 Swimmable,以及一個實現這兩個接口的 Duck 類。
public interface Flyable { void fly(); }
public interface Swimmable { void swim(); }
public class Duck implements Flyable, Swimmable { @Override public void fly() { System.out.println("Duck is flying"); } @Override public void swim() { System.out.println("Duck is swimming"); } public static void main(String[] args) { Duck duck = new Duck(); duck.fly(); duck.swim(); } }
介面:
班級:
主要方法:
Duck is flying Duck is swimming
這裡用一個簡單的圖來說明這種關係:
+----------------+ | Flyable |<--------------->Interface |----------------| | + fly() | +----------------+ ^ | | Implements | +----------------+ | Duck |<--------------->Class |----------------| | + fly() | | + swim() | +----------------+ ^ | | Implements | +----------------+ | Swimmable |<--------------->Interface |----------------| | + swim() | +----------------+
在此範例中,Duck 類別透過實作 Flyable 和 Swimmable 介面來示範多重繼承。這允許 Duck 類別繼承並提供兩個介面中定義的方法的實現,展示了 Java 如何透過介面實現多重繼承。
Java 中的抽象類別用於為一系列相關類別提供公共基礎。它們可以包含抽象方法(沒有主體的方法)和具體方法(有主體的方法)。下面是一個示範抽象類別使用的範例。
讓我們定義一個抽象類別 Animal 和兩個擴展 Animal 類別的子類別 Dog 和 Cat。
public abstract class Animal { // Abstract method (does not have a body) public abstract void makeSound(); // Concrete method (has a body) public void sleep() { System.out.println("The animal is sleeping"); } }
public class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog says: Woof!"); } public static void main(String[] args) { Dog dog = new Dog(); dog.makeSound(); dog.sleep(); } }
public class Cat extends Animal { @Override public void makeSound() { System.out.println("Cat says: Meow!"); } public static void main(String[] args) { Cat cat = new Cat(); cat.makeSound(); cat.sleep(); } }
抽象類:動物
子類:狗
子類:貓
對於狗類:
public interface Flyable { void fly(); }
對於貓:
public interface Swimmable { void swim(); }
這裡用一個簡單的圖來說明這種關係:
public class Duck implements Flyable, Swimmable { @Override public void fly() { System.out.println("Duck is flying"); } @Override public void swim() { System.out.println("Duck is swimming"); } public static void main(String[] args) { Duck duck = new Duck(); duck.fly(); duck.swim(); } }
在此範例中,Animal 抽象類別為 Dog 和 Cat 子類別提供了公共基礎。 Animal 類別定義了一個必須由任何子類別實作的抽象方法 makeSound() 和一個提供預設實作的具體方法 sleep()。 Dog 和 Cat 類別擴展了 Animal 類別並提供了它們自己的 makeSound() 方法的實作。
Duck is flying Duck is swimming
介面通常用於定義 API、框架和函式庫。例如,java.util.List介面提供了列表實作的契約,例如ArrayList和LinkedList。
+----------------+ | Flyable |<--------------->Interface |----------------| | + fly() | +----------------+ ^ | | Implements | +----------------+ | Duck |<--------------->Class |----------------| | + fly() | | + swim() | +----------------+ ^ | | Implements | +----------------+ | Swimmable |<--------------->Interface |----------------| | + swim() | +----------------+
抽象類別通常用於為一系列相關類別提供基底類別。例如,java.util.AbstractList類別提供了List介面的骨架實現,減少了子類別需要實現的程式碼量。
public interface Flyable { void fly(); }
SNo | Interface | Abstract Class |
---|---|---|
1 | Interfaces cannot be instantiated | Abstract classes cannot be instantiated |
2 | It can have both abstract and non-abstract methods | It can have both abstract and non-abstract methods |
3 | In interfaces, all fields are automatically public, static, and final, and all methods that you declare or define (as default methods) are public | In abstract classes, you can declare fields that are not static and final, and define public, protected, and private concrete methods |
4 | Interface supports multiple inheritance. Multiple interfaces can be implemented | Abstract class or class can extend only one class |
5 | It is used if you expect that unrelated classes would implement your interface. Eg, the interfaces Comparable and Cloneable are implemented by many unrelated classes | It is used if you want to share code among several closely related classes |
6 | It is used if you want to specify the behavior of a particular data type, but not concerned about who implements its behavior. | It is used if you expect that classes that extend your abstract class have many common methods or fields, or require access modifiers other than public (such as protected and private) |
參考:https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
當抽象類別被子類別化時,子類別通常為其父類別中的所有抽象方法提供實作。但是,如果沒有,則子類別也必須聲明為抽象的。
根據《Effective Java》的作者 Joshua Bloch 的說法,在定義類型時,介面比抽象類別更受青睞,因為它們更靈活並且支援多重繼承。然而,抽象類別對於提供共享功能和減少程式碼重複很有用。
「介面非常適合定義 mixins。相較之下,類別非常適合定義具有內在屬性的物件。」
- 約書亞·布洛赫
在您自己的 Java 專案中探索介面和抽象類別的強大功能。嘗試使用介面定義合約並使用抽象類別提供共享功能。與 Java 社群分享您的見解和經驗,為集體知識和成長做出貢獻。
歡迎對本文進行任何更正或補充。
public interface Flyable { void fly(); }
以上是Java 中的介面與抽象類的詳細內容。更多資訊請關注PHP中文網其他相關文章!