28.
抽象クラス
抽象クラスとは
抽象クラスはオブジェクト指向プログラミングで、プログラムの実装しないメソッドを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や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の定義で正しいのはどれですか?
- public class abstract AnimalAbstract { }
- public class AnimalAbstract abstract { }
- public abstract class MonsterAbstract { }
- public static class AnimalAbstract { }
問題2
抽象メソッド「eat()」の定義で正しいのはどれですか?
- public abstract void eat(String thing);
- public abstract void eat(String thing) { };
- public void abstract eat(String thing);
- public void abstract eat(String thing) { };
問題3
抽象クラスAnimalAbstractに eat(String thing) メソッドを宣言し、Animalクラスで実装してみましょう。