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