Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの抽象クラスとインターフェースの違いを徹底解説!使い分けのポイントも紹介

Javaにおいて抽象化(Abstraction)は、抽象クラス(Abstract Class)インターフェース(Interface)の2つの仕組みによって実現されます。どちらも抽象メソッドを含み、その実装は子クラスや実装クラスに委ねられますが、それぞれ役割や特性が異なります。

本記事では、抽象クラスとインターフェースの主な違いを比較表でわかりやすく整理し、実際のコード例とあわせて解説します。

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

No.項目抽象クラスインターフェース
1サポートされるメソッド抽象メソッドと具象メソッド(実装あり)の両方を持つことができます。基本的には抽象メソッドのみ。ただしJava 8以降はdefaultメソッドおよびstaticメソッドも定義できます。
2多重継承多重継承はサポートされていません。複数のインターフェースを実装できるため、多重継承が可能です。
3サポートされる変数final・非final・static・非staticのすべての変数を宣言できます。暗黙的にpublic static finalとなる変数(定数)のみ許可されます。
4実装インターフェースを実装(implements)できます。インターフェースを実装することはできず、他のインターフェースをextendsで拡張することのみ可能です。
5宣言キーワードabstractキーワードを使用して宣言します。interfaceキーワードを使用して宣言します。
6継承の範囲extendsキーワードで別のクラスを継承しつつ、インターフェースを実装できます。継承できるのはインターフェースのみです。
7継承・実装の方法extendsキーワードによって継承されます。implementsキーワードによって実装されます。
8アクセス修飾子private、publicなど任意のアクセス修飾子を持つメンバーを定義できます。メンバーは暗黙的にpublicとなり、public以外のメンバーは定義できません。

抽象クラスとインターフェースのコード例

次のサンプルコードでは、インターフェースAnimalを実装したTigerクラスと、抽象クラスCatを継承したLionクラスを定義しています。

JavaTester.java

public class JavaTester {
    public static void main(String args[]) {
        Animal tiger = new Tiger();
        tiger.eat();
        Cat lion = new Lion();
        lion.eat();
    }
}

// インターフェースの定義
interface Animal {
    public void eat();
}

// インターフェースを実装するクラス
class Tiger implements Animal {
    public void eat(){
        System.out.println("Tiger eats");
    }
}

// 抽象クラスの定義
abstract class Cat {
    abstract public void eat();
}

// 抽象クラスを継承するクラス
class Lion extends Cat{
    public void eat(){
        System.out.println("Lion eats");
    }
}

実行結果

Tiger eats
Lion eats

使い分けのポイント

どちらを選ぶべきか迷った場合は、以下の観点で判断するとよいでしょう。

  • 共通の状態(フィールド)や部分的な実装を持ちたい場合 → 抽象クラスが適しています。コンストラクタや非publicメンバーも定義できます。
  • 無関係なクラス群に共通の契約(API)を課したい場合 → インターフェースが適しています。1つのクラスは1つのクラスしか継承できませんが、複数のインターフェースは同時に実装できます。
  • 将来的な拡張性 → Java 8以降のインターフェースはdefaultメソッドを持てるため、柔軟性が向上しましたが、状態を持たないという制限は変わりません。

一般的には「is-a関係の階層構造を表現しつつ共通処理を提供したいなら抽象クラス」「できること(capability)を定義して複数実装させたいならインターフェース」という使い分けが基本となります。

  1. Javaのイベントリスナーインターフェースとイベントアダプタクラスの違いを解説

    EventListener(イベントリスナー)インターフェースは、特定の種類のイベントを処理するために、イベントハンドラ側で実装すべきメソッドを定義するものです。一方、イベントアダプタ(Event Adapter)クラスは、EventListenerインターフェースのデフォルト実装を提供する抽象クラスです。本記事では、それぞれの特徴と具体的なコード例をもとに、両者の違いと使い分けのポイントを解説します。 イベントリスナー(EventListener)とは イベントリスナーは、すべてのコンポーネントがイベントを処理するための中核となる仕組みです。 EventListenerインターフェースの

  2. Javaの抽象クラスとは?基本ルールと実装例をわかりやすく解説

    Javaの抽象クラスとは宣言に「abstract」キーワードを含むクラスは、抽象クラスと呼ばれます。抽象クラスは、継承によって利用されることを前提とした設計用のクラスであり、オブジェクト指向プログラミングにおける重要な概念の一つです。抽象クラスの主な特徴抽象クラスには、抽象メソッド(本体を持たないメソッド。例:public void get();)が含まれる場合もあれば、含まれない場合もあります。ただし、クラス内に1つでも抽象メソッドが存在する場合、そのクラスは必ず abstract として宣言しなければなりません。abstract として宣言されたクラスは、インスタンス化(newによるオブジ