【Java】 抽象クラス / abstract について

特徴

クラスに適用した場合

 * 継承させることが必須となる
 * そのクラスは、インスタンス化できなくなる

メソッドに適用した場合

 * そのメソッドは、オーバーライドが必須となる
 * そのメソッドは、処理内容を記述できない
 * そのメソッドのクラスにも、abstractの指定が必須となる

使いどころ

 [1] インターフェイスを実装するクラスを複数作成したところ、
     どのクラスにも共通の実装が必要なことが分かり、コードを共有化したい

 [2] クラスが実装するべきインターフェイスは決まっていて、
     一部については実装方法も決まっているが、全部の実装方法までは決まっていない

 [3] 既存のクラスに、あるインターフェイスを実装することにして、基本クラスとして使いたい

# 結構、上記のことってあり得るよな...

インターフェイスとの違い

 * インターフェイスは、複数継承可能
 * 抽象クラスは、1つしか継承できない

 * インターフェイスは、抽象メソッドのみしか宣言できない
 * 抽象クラスは、抽象メソッドと抽象メソッドでないメソッドの両方を宣言できる

サンプル

AbstractClass.java

abstract public class AbstractClass extends Thread {
   abstract public void methodA() throws Exception;
   
   @Override
   public void run() {
      try {
         this.methodA();
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

ChildClass.java

public class ChildClass extends AbstractClass {

   @Override
   public void methodA() throws Exception {
      // 何らかの処理
   }
}