Javaのabstractは抽象クラスを作るためのアクセス修飾子です。抽象クラスとはインスタンス化できないクラスのことで、継承させて使うためのクラスです。この記事では、abstractと抽象クラスの使い方をご紹介します。

宣言できるもの

abstractで宣言できるものとして、クラスとメソッドがあります。

Class

抽象クラスとは直接インスタンス化できないクラスです。 通常、抽象クラスから派生クラスを作成して使用します。 抽象クラスは class の前に abstract を付けます。 抽象クラスではメソッドを宣言することができます。これを仮想関数と呼びます。 基底クラスに仮想関数がある場合、仮想関数を実装しなければ、その派生クラスも抽象クラスになります。

abstract class Abstract1 {
  abstract public void method();
}
class Abstract2 extends Abstract1 {
  public void method() {
    System.out.println("Abstract2::method");
  }
  public static void main(String arg[]) {
    Abstract2 a = new Abstract2();
    a.method();
  }
}

メソッド

abstractで修飾されたメソッドは抽象メソッドとなる。

abstract Foo {
  abstract public void bar();
}

抽象メソッドとは、サブクラスで必ずオーバーライドされるメソッドである。

class Baz extends Foo {
  public void bar() {
    // do someshing
  }
}

コンストラクタ

抽象クラスを直接インスタンス化することはできないが、コンストラクタを定義することはできる。

abstract class Foo {
  int bar;
  public Foo(int bar) {
    this.bar = bar;
  }
  abstract public void baz();
}

Template Methodパターン

デザインパターンのひとつである「Template Methodパターン」は、抽象クラスを利用して大まかな処理をメソッドで定義し、詳細な処理は抽象メソッドにして継承クラスで定義させる。

public abstract class TemplateMethod {
  public abstract boolean foo();
  public abstract void bar();
  public abstract void baz();
  public void example() {
    if (foo()) {
      bar();
    } else {
      baz();
    }
  }
}
class A extends TemplateMethod {
  public boolean foo() {
    // do something
  }
  public void bar() {
    // do something
  }
  public void baz() {
    // do something
  }
}
class B extends TemplateMethod {
  public boolean foo() {
    // do something
  }
  public void bar() {
    // do something
  }
  public void baz() {
    // do something
  }
}