抽象クラスとは

抽象クラスはオブジェクト指向プログラミングで、プログラムの実装しないメソッドを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 {
    ....
}

サブクラスの生成

サブクラス「Character」のインスタンスを生成します。コンパイルエラーにはなりません。「Character」を継承した「Wizard」でも問題なくインスタンス生成できます。

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

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