【Java】インターフェースと抽象クラス
インターフェース
前回、立方体の体積を求めるメソッドをインターフェースThreeDで宣言し、立方体を定義するクラスBoxに多重継承して具体的なメソッドを記述しました。
public interface ThreeD { //体積を計算するための抽象メソッド public int calcVolume(); }
//implements - インターフェース、extend - 継承 public class Box extends Rect implements ThreeD { ..... //体積を求める public int calcVolume(){ //インターフェースで宣言された抽象メソッドに具体的なメソッドを記述します return super.calcArea() * this.length; } }
抽象クラスとは
メソッドの名前と引数の型だけ定まっていて、その本体(実装)がないメソッドのことを抽象メソッドと呼びます。抽象メソッドを含んでいるクラスを抽象クラスと呼びます。抽象クラスにはabstractという修飾子がつきます。では、具体的な例として抽象クラスFigをクラスRectのスーパークラスにしてみます。
public abstract class Fig { //デフォルトコンストラクタ //抽象クラスFigを親にもつサブクラスはインスタンス化されるたびコンソールにFigと表示 public Fig(){ System.out.println("Fig"); } //抽象メソッド:面積の計算、親の命令は必ず子にも実装しないとエラーになる public abstract int calcArea(); }
public class Rect extends Fig { ..... //メソッド //面積の計算 public int calcArea(){ return this.height * this.width; } ..... }
まとめ
抽象メソッドを記述した抽象クラスを親にもつサブクラスは、必ず抽象メソッドを実装しなければなりません。抽象クラスは自分では動作を規定しないけれど、どういうメソッドが必要なのかをサブクラスに指示しているのです。つまり抽象クラスを使うことでサブクラスのメソッドが揃うため、読みやすいプログラムを記述することができます。