ホームページ  >  記事  >  Java  >  Java のインターフェースと抽象クラス

Java のインターフェースと抽象クラス

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 02:26:28902ブラウズ

インターフェイスと抽象クラスは、抽象化とポリモーフィズムを実現するために不可欠なコンポーネントです。

インターフェースとは何ですか?

Java のインターフェイスは、クラスに似た参照型であり、抽象メソッド、静的メソッド、デフォルト メソッド、および静的最終変数 (定数) のみを含めることができます。インターフェイスは、Java で抽象化と多重継承を実現するために使用されます。インターフェースは直接インスタンス化できない場合があります。

Interfaces and Abstract Classes in Java

?Java 8 より前では、インターフェースには 抽象メソッド のみを含めることができました。
これらのメソッドの実装は、別のクラスで提供する必要があります。したがって、新しいメソッドをインターフェイスに追加する場合は、その実装コードを同じインターフェイスを実装するクラスで提供する必要があります。

?この問題を解決するために、Java 8 では デフォルト メソッド の概念が導入されました。これにより、インターフェースを実装するクラスに影響を与えることなく、インターフェースが実装されたメソッドを持つことができるようになります。 .

必要に応じてクラスを実装することで、デフォルトのメソッドをオーバーライドできます。

インターフェースの主な機能

  • 抽象メソッド: 本文のないメソッド。abstract キーワードを使用して宣言されます。
  • デフォルト メソッド: Java 8 で導入された本体を持つメソッド。これにより、インターフェイスがデフォルトの実装を提供できるようになります。
  • 静的メソッド: インターフェイスのインスタンスではなく、インターフェイス自体に属するメソッド。
  • 定数: static および Final として宣言された変数。暗黙的に public です。

抽象クラスとは何ですか?

Java の抽象クラスは、単独ではインスタンス化できないクラスであり、抽象メソッド (本体のないメソッド) と具象メソッド (本体のあるメソッド) を含む場合があります。抽象クラスは、サブクラスに共通のベースを提供するために使用され、コードの再利用と共有動作の定義を可能にします。

抽象クラスの主な機能

  • 抽象メソッド: 本文のないメソッド。abstract キーワードを使用して宣言されます。
  • 具象メソッド: デフォルトの実装を提供する本体を持つメソッド。
  • コンストラクター: 抽象クラスはコンストラクターを持つことができますが、直接インスタンス化することはできません。
  • インスタンス変数: 抽象クラスはインスタンス変数と静的変数を持つことができます。

インターフェイスと抽象クラスの違い

多重継承

  • インターフェース: Java はインターフェースを介した多重継承をサポートしており、クラスが複数のインターフェースを実装できるようにします。
  • 抽象クラス: Java はクラスの多重継承をサポートしていません。つまり、クラスは 1 つの抽象クラスのみを拡張できます。

メソッド本体

  • インターフェース: Java 8 より前は、インターフェースにメソッド本体を含めることはできませんでした。 Java 8 では、デフォルトメソッドと静的メソッドに本体を含めることができます。
  • 抽象クラス: 抽象クラスには、抽象メソッド (本体なし) と具象メソッド (本体あり) の両方を含めることができます。

変数

  • インターフェース: インターフェース内の変数は、暗黙的に public、static、final です。
  • 抽象クラス: 抽象クラスには、インスタンス変数、静的変数、定数を含めることができます。

使用法

  • インターフェース: 複数のクラスが実装できるコントラクトを定義するのに最適です。
  • 抽象クラス: 関連するクラスのファミリーに共通の基盤を提供し、コードと動作を共有するのに適しています。

Java の継承に対するアプローチ

Java は単一継承のみをサポートします。つまり、各クラスは 1 つのクラスのフィールドとメソッドのみを継承できます。複数のソースからプロパティを継承する必要がある場合、Java は 多重継承 の形式である インターフェース の概念を提供します。

?インターフェイスはクラスに似ています。ただし、これらはメソッドのシグネチャのみを定義し、その実装は定義しません。インターフェイスで宣言されたメソッドはクラスに実装されます。 多重継承は、クラスが複数のインターフェースを実装する場合に発生します。

Java では、クラスではなくインターフェイスを通じて多重継承が実現されます。これにより、クラスが複数のインターフェイスを実装し、それぞれのインターフェイスからメソッド シグネチャを継承できるようになります。以下は、インターフェースを使用した多重継承を示す例です。

インターフェースを使用した多重継承の例

Flyable と Swimmable という 2 つのインターフェイスと、両方のインターフェイスを実装するクラス 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();
    }
}

説明

  1. インターフェース:

    • Flyable インターフェースはメソッド fly() を定義します。
    • スイマブルインターフェイスはメソッド swim().
    • を定義します。
  2. クラス:

    • Duck クラスは、Flyable インターフェイスと Swimmable インターフェイスの両方を実装します。
    • Duck クラスは、fly() メソッドと swim() メソッドの両方の実装を提供します。
  3. メインメソッド:

    • Duck のインスタンスが作成されます。
    • fly() メソッドと swim() メソッドが Duck インスタンスで呼び出され、Duck クラスが両方のインターフェイスから動作を継承していることがわかります。

出力

Duck is flying
Duck is swimming

関係を説明するための簡単な図を次に示します。

+----------------+
|    Flyable     |<--------------->Interface
|----------------|
| + fly()        |
+----------------+
          ^
          |
          | Implements
          |
+----------------+
|     Duck       |<--------------->Class
|----------------|
| + fly()        |
| + swim()       |
+----------------+
          ^
          |
          | Implements
          |
+----------------+
|   Swimmable    |<--------------->Interface
|----------------|
| + swim()       |
+----------------+

この例では、Duck クラスは Flyable インターフェイスと Swimmable インターフェイスの両方を実装することによって多重継承を示しています。これにより、Duck クラスが両方のインターフェースで定義されたメソッドの実装を継承して提供できるようになり、Java がインターフェースを通じて多重継承をどのように実現するかを示します。


Javaの抽象クラス

Java の抽象クラスは、関連するクラスのファミリーに共通の基盤を提供するために使用されます。これらには、抽象メソッド (本体のないメソッド) と具象メソッド (本体のあるメソッド) の両方を含めることができます。以下は、抽象クラスの使用を示す例です。

抽象クラスの例

抽象クラス Animal と、Animal クラスを拡張する 2 つのサブクラス 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();
    }
}

説明

  1. 抽象クラス: 動物

    • Animal クラスは抽象クラスとして宣言されており、直接インスタンス化できないことを意味します。
    • これには抽象メソッド makeSound() が含まれており、サブクラスによって実装する必要があります。
    • デフォルトの実装を提供する具象メソッド sleep() も含まれています。
  2. サブクラス: 犬

    • Dog クラスは Animal クラスを拡張します。
    • 抽象メソッド makeSound() の実装を提供します。
    • main メソッドは Dog のインスタンスを作成し、makeSound() メソッドと sleep() メソッドを呼び出します。
  3. サブクラス: 猫

    • Cat クラスは Animal クラスを拡張します。
    • 抽象メソッド makeSound() の実装を提供します。
    • main メソッドは Cat のインスタンスを作成し、makeSound() メソッドと sleep() メソッドを呼び出します。

出力

犬クラスの場合:

public interface Flyable {
    void fly();
}

Cat クラスの場合:

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() メソッドの実装を提供します。

インターフェイスに関する重要なポイント

  1. 抽象化: Java のインターフェースは抽象化を実現するメカニズムです。
  2. デフォルト メソッド: デフォルトでは、インターフェイス メソッドは抽象メソッドおよびパブリックです。
  3. メソッドの種類: インターフェイス メソッドは、public、private、abstract、default、static、および strictfp のみです。
  4. フィールド タイプ: インターフェイス フィールド (変数) は、public、static、final のみです。
  5. IS-A 関係: Java インターフェースは IS-A 関係も表します。
  6. インスタンス化: 抽象クラスと同様に、直接インスタンス化することはできません。
  7. 疎結合: 疎結合を実現するために使用できます。
  8. 暗黙的に抽象: すべてのインターフェイスは暗黙的に抽象です。
  9. デフォルト メソッド: デフォルト メソッドはインターフェイス内でのみ許可されます。
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 によると、インターフェイスはより柔軟で多重継承をサポートしているため、型を定義する場合は抽象クラスよりも好まれます。ただし、抽象クラスは、共有機能を提供し、コードの重複を減らすのに役立ちます。

"インターフェイスはミックスインの定義に最適です。対照的に、クラスは固有のプロパティを持つオブジェクトの定義に最適です。"

  • ジョシュア・ブロック

ハイライト

  • インターフェース: コントラクトを定義し、多重継承をサポートするのに最適です。
  • 抽象クラス: 関連するクラスに共通の基盤を提供し、コードと動作を共有するのに適しています。
  • 相違点: インターフェースは抽象メソッドのみを持つことができますが (Java 8 以前)、抽象クラスは抽象メソッドと具象メソッドの両方を持つことができます。
  • 使用法: インターフェイスは API とフレームワークを定義するために使用され、抽象クラスは骨格的な実装を提供するために使用されます。

さらに探索する

独自の Java プロジェクトでインターフェースと抽象クラスの力を試してください。インターフェイスを使用してコントラクトを定義し、抽象クラスを使用して共有機能を提供することを試してください。あなたの洞察や経験を Java コミュニティと共有して、集合的な知識と成長に貢献してください。

この投稿に対する修正や追加は大歓迎です。

public interface Flyable {
    void fly();
}

以上がJava のインターフェースと抽象クラスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。