【Java】抽象クラス

2018年1月5日

本稿は抽象クラスについて説明します。

抽象クラスとは必ず継承して利用しなければならないクラスです。

実装が不十分なのでプログラマが実装してやる必要があるのですね。

抽象クラスには抽象メソッドを定義でき、抽象メソッドは必ずサブクラスでオーバーライドされなければなりません。

では、どういうときに使うのかという、例を挙げてみましょう。


複数の開発者がいたとして、Aという開発者はベースとなるキャラクタクラスを作成します。

キャラクラスは移動処理が必須なので、他の開発者には移動メソッドは必ず実装してほしいです。

必ず実装してほしいメソッドを抽象メソッドmoveで定義しておきます。

BとCの開発者は、自分が作りたいキャラをキャラクタクラスを継承して作成します。

抽象メソッドの実装は必須となるので、それぞれ実装漏れがなく、moveメソッドは必ず独自実装されます。


このように、そのクラスの利用者に実装を強制させて実装漏れがないようにすることができます。

抽象クラス、抽象メソッドの定義

抽象クラスは「abstract class クラス名」と定義します。

抽象メソッドは「abstract 戻り値 メソッド名(引数);」と定義します。

抽象メソッドはいつも使用している「{}」がないので注意してください。

abstract class Chara{
	abstract void move();
}

抽象クラスの利用

次に抽象クラスを利用してみます。

public class Test{
	public static void main(String[] args){
		Chara teki = new Teki();
		teki.move();
	}
}
abstract class Chara{
	abstract void move();
}
class Teki extends Chara{
	void move(){
		System.out.println("移動しました。");
	}
}
実行結果

移動しました。


抽象クラスは直接インスタンス化出来なくなります。

public class Test{
	public static void main(String[] args){
		Chara teki = new Chara();
	}
}
abstract class Chara{
	abstract void move();
}
コンパイル結果

Test.java:3: エラー: Charaはabstractです。インスタンスを生成することはできません
Chara teki = new Chara();
^
エラー1個


抽象メソッドが実装されていなかったらコンパイルエラーになります。

public class Test{
	public static void main(String[] args){
		Chara teki = new Teki();
	}
}
abstract class Chara{
	abstract void move();
}
class Teki extends Chara{
}
コンパイル結果

Test.java:9: エラー: Tekiはabstractでなく、Chara内のabstractメソッドmove()をオー
バーライドしません
class Teki extends Chara{
^
エラー1個