Java 速習チュートリアル

Java の抽象化

1. 抽象クラスと抽象メソッド

データ抽象化(Abstraction)とは、特定の詳細な実装を隠し、ユーザーに対して必要な情報のみを表示するプロセスのことです。

Javaにおける抽象化は、抽象クラス(Abstract classes)またはインターフェース(Interfaces)(これについては次のチャプターで詳しく学びます)のいずれかを使用して実現されます。

abstract キーワードは非アクセス修飾子であり、クラスとメソッドに対して使用されます:

  • 抽象クラス: オブジェクトを作成するために使用できない制限されたクラスです(アクセスするには、別のクラスから継承する必要があります)。
  • 抽象メソッド: 抽象クラス内でのみ使用でき、メソッドのボディ(実装部)を持ちません。ボディは継承先のサブクラスによって提供されます。

抽象クラスには、抽象メソッドと通常のメソッドの両方を含めることができます。

abstract class Animal {
  public abstract void animalSound();
  public void sleep() {
    System.out.println("Zzz");
  }
}

上記の例では、Animal クラスのオブジェクトを作成することはできません。

Animal myObj = new Animal(); // これはコンパイルエラーを生成します

抽象クラスにアクセスするには、別のクラスから継承する必要があります。ポリモーフィズムの章で使用した Animal クラスを抽象クラスに変換してみましょう。

継承には、以前学んだ通り extends キーワードを使用します。

実装例:

// 抽象クラス (Abstract class)
abstract class Animal {
  // 抽象メソッド (ボディを持ちません)
  public abstract void animalSound();
  // 通常のメソッド
  public void sleep() {
    System.out.println("Zzz");
  }
}

// サブクラス (Animalから継承)
class Pig extends Animal {
  public void animalSound() {
    // animalSound() のボディはここで提供されます
    System.out.println("ブタが鳴きます:ウィーウィー");
  }
}

class Main {
  public static void main(String[] args) {
    Pig myPig = new Pig(); // Pigオブジェクトを作成
    myPig.animalSound();
    myPig.sleep();
  }
}

2. なぜ、いつ抽象クラスや抽象メソッドを使用するのか?

  • セキュリティの向上: オブジェクトの特定の詳細を隠し、重要な詳細のみを表示することで、不用意なアクセスや誤用を防ぎます。
  • テンプレートの提供: サブクラスが必ず実装すべきメソッドを定義することで、一貫性のある設計を強制できます。