抽象クラスとは

抽象クラスはオブジェクト指向プログラミングで、プログラムの実装しないメソッドを1つ以上持つクラスを指します。抽象クラスそのものをインスタンス化することはできません。

抽象メソッド

抽象メソッド(abstract)は「メソッド名」「引数」「データ型」などを宣言して、実装コードは記述しません。

ポリモーフィズムの1つ

抽象メソッドを定義したら、継承したサブクラスは必ず実装する必要があります。抽象クラスは実装を忘れない設計にするのが目的のクラスです。同じメソッドを必ず実装するという点で、ポリモーフィズムの1つです。

抽象クラスのルール

abstract

抽象クラス、抽象メソッドはabstractキーワードをつけて宣言します。

abstractクラス

抽象クラスは、クラス名の前にabstractをつけます。

public abstract class クラス名 {

}

abstractメソッド

抽象メソッドは、メソッド名の前にabstractをつけ、実装はせずに宣言します。

public abstract メソッド名();

抽象クラスの継承

抽象クラスを利用するには、継承を利用します。この場合、スーパークラスが抽象クラスになります。

public サブクラス extends 抽象クラス {

}

サブクラスでメソッド実装

抽象クラスで宣言したabstractメソッドを、サブクラスで実装します。スーパークラスと同じメソッドなのでオーバーライドになります。

@Override
public メソッド名 {

}

抽象クラスを使ってみる

抽象クラスに抽象メソッドを宣言し、サブクラスで利用してみましょう。

抽象クラスの作成

CharacterAbstractクラスを作成し、abstractを選択します。

CharacterAbstractが作成されました。

CharacterAbstract.java
package character;

public abstract class CharacterAbstract {

}

抽象メソッドの宣言

抽象メソッドattack()isAlive() メソッドを、abstractで宣言します。

CharacterAbstract.java
package character;

import monster.Monster;

public abstract class CharacterAbstract {

	public abstract void attack(Monster monster);
	public abstract boolean isAlive();
}

抽象クラスとインスタンス

抽象クラスのインスタンスを作成します。

App4.java
package character;

public class App4 {

	public static void main(String[] args) {
		CharacterAbstract = new CharacterAbstract();
	}

}

抽象クラスのインスタンス生成はエラー

抽象クラスをインスタンス生成しようとするとコンパイルエラーになりました。抽象クラスが特殊なクラスであることがわかります。

サブクラスの実装

サブクラスで抽象クラスを継承し、実装してみましょう。

スーパークラスの継承

サブクラスCharacterから、抽象クラス(スーパークラス)を継承します。

App4.java
public Character extends CharacterAbstract {
    ....
}

サブクラスの生成

CharacterWizardのインスタンスを生成すると正常にコンパイルでいます。

App4.java
package character;

public class App4 {

	public static void main(String[] args) {
		Character character = new Character("チャーリー");
        Wizard wizard = new Wizard("アリス");
	}

}

抽象メソッドの追加

CharacterAbstractに、抽象メソッドmagic() を追加します。

CharacterAbstract.java
public abstract class CharacterAbstract {

	public abstract void attack(Monster monster);
	public abstract boolean isAlive();
	public abstract void magic(Monster monster, String key);
}

実装エラー

抽象メソッドmagic() が、サブクラスに実装されていないため、コンパイルエラーになります。

メソッドの自動挿入

クラス名にマウスオーバーして「実装されていないメソッドの追加」をクリックします。

サブクラスにmagic() メソッドが自動挿入されました。

	@Override
	public void magic(Monster monster, String key) {
		
	}

演習

問題1

抽象クラスAnimalAbstractの定義で正しいのはどれですか?

  1. public class abstract AnimalAbstract { }
  2. public class AnimalAbstract abstract { }
  3. public abstract class MonsterAbstract { }
  4. public static class AnimalAbstract { }

問題2

抽象メソッド「eat()」の定義で正しいのはどれですか?

  1. public abstract void eat(String thing);
  2. public abstract void eat(String thing) { };
  3. public void abstract eat(String thing);
  4. public void abstract eat(String thing) { };

問題3

抽象クラスAnimalAbstracteat(String thing) メソッドを宣言し、Animalクラスで実装してみましょう。