Java入門

【Java入門】抽象クラス(abstract)

2021年5月2日

はじめに

前回の記事では、Javaのオーバーライドについて紹介しました。

本記事では、Javaの抽象クラス(abstract)について紹介します。

抽象クラス(abstract)

抽象クラスとは、抽象メソッドを1つ以上持つクラスのことです。抽象メソッドとは、定義だけで処理を書かないメソッドです。

そして、抽象クラスを継承したサブクラス(子クラス)で抽象メソッドをオーバーライドし処理を記述します。

抽象クラスではサブクラスに必要なメソッドを定義するだけです。メソッドの中身はサブクラスで記述します。

また、抽象クラスには抽象メソッド以外の処理を記述することもできます。

スポンサーリンク

以下は抽象クラスの例です。

抽象クラスは「abstract修飾子」を使って定義します。そして、抽象メソッドにも「abstract修飾子」を使います。

抽象クラス(abstract)の例

また、抽象クラスで定義した抽象メソッドは、サブクラスで必ず実装しなければいけません。サブクラスで抽象メソッドを実装しないとコンパイルエラーが発生します。

抽象メソッドの作成は必須

なぜ抽象クラス(abstract)が必要なのか

抽象クラスって何のためにあるんですか?
抽象クラスを使えば、ある程度の実装ルールを作れます。

システム開発は、開発規模が大きければ大きい程、大人数で開発をおこないます。その際、ある程度の開発ルールを定めておかなければ、担当者ごとに書き方が異なり、同じような処理なのに書き方が全く違うという結果になりかねません。

そこで、抽象クラスを使えばある程度、書き方を統一できます。

例えば、動物の抽象クラスがあるとします。

■動物クラス

  • 抽象メソッド:animalType
  • 抽象メソッド:cry

そして「猫クラス」と「犬クラス」を実装する際は、抽象クラスである「動物クラス」を継承して作るようにルールを決めます。

■猫クラス

  • メソッド:animalType
  • メソッド:cry

■犬クラス

  • メソッド:animalType
  • メソッド:cry

抽象クラスにある、抽象メソッドはサブクラスで必ず実装しなければいけません。その結果「猫クラス」と「犬クラス」は似たような構成となり、書き方が統一されました。

このように抽象クラスを使えば、似たような機能の書き方を統一できます。

インタフェースも同じように書き方を統一できる機能です。インタフェースについては次回の記事で紹介しています。

スポンサーリンク

抽象クラス(abstract)の実装例

それでは、実際にソースコードで抽象クラス(abstract)の例を紹介します。

次の例では、抽象クラスに通常メソッド1つ(execute)と抽象メソッド2つ(animalTypeとcry)を定義しています。

[抽象クラス]

public abstract class Animal {
    /**
     * 実行メソッド
     */
    public void execute() {
        System.out.println("動物の種類は" + animalType());
        System.out.println("鳴き声は" + cry());
    }

    /**
     * 抽象メソッド(動物の種類)
     */
    abstract protected String animalType();

    /**
     * 抽象メソッド(鳴き声)
     */
    abstract protected String cry();
}

そして、「猫クラス」と「犬クラス」が抽象クラスを継承しています。抽象クラスで定義されている抽象メソッドの実装は必須なので、「猫クラス」と「犬クラス」の構成はほとんど同じです。

[猫クラス(サブクラス)」

public class Cat extends Animal {
    /**
     * 動物の種類
     */
    @Override
    protected String animalType() {
        return "猫";
    }

    /**
     * 鳴き声
     */
    @Override
    protected String cry() {
        return "みゃー";
    }
}

[犬クラス(サブクラス)」

public class Dog extends Animal {
    /**
     * 動物の種類
     */
    @Override
    protected String animalType() {
        return "犬";
    }

    /**
     * 鳴き声
     */
    @Override
    protected String cry() {
        return "わん";
    }
}

最後に「MainSample」クラスで「猫クラス」と「犬クラス」の「execute」メソッドを実行しています。

[プログラムの実行]

public class MainSample {

    public static void main(String[] args) {

        // 猫クラスの実行
        Animal cat = new Cat();
        cat.execute();

        // 犬クラスの実行
        Animal dog = new Dog();
        dog.execute();
    }
}

[実行結果]

動物の種類は猫
鳴き声はみゃー
動物の種類は犬
鳴き声はわん

「猫クラス」と「犬クラス」の「execute」メソッドの実行結果が表示されました。

今回の例のように「Animal」クラスの「execute」メソッドを実行した結果、「猫クラス」のオブジェクトを生成した時と「犬クラス」のオブジェクトを生成した時で、実行結果が異なっています。

このように、同じ処理で異なる動作を実現する(1つのオブジェクトやメソッドが多くの形態を持つ)ことを「多態性(ポリモーフィズム)」といいます。

多態性はオブジェクト指向の大きな特徴の一つです。

※オブジェクト指向の3大要素は「継承」「ポリモーフィズム(多態性)」「カプセル化」

終わりに

本記事では、Javaの抽象クラス(abstract)について紹介しました。

次回の記事では、Javaのインタフェースについて紹介します。

helpful