Javaでは、クラスの設計と再利用のためにインターフェースと抽象クラスが提供されています。これらの概念を理解し、プログラムの柔軟性と再利用性を向上させることが重要です。本ブログでは、インターフェースと抽象クラスの違いと、それぞれの使い方について説明します。また、実践的なコード例を用いて、その使い方を解説します。
目次
インターフェースとは
インターフェースは、アプリケーションの設計段階で、クラスが実装すべきメソッドのシグニチャ(戻り値の型、メソッド名、引数リスト)を定義するものです。インターフェースを実装するクラスは、インターフェースで定義されたすべてのメソッドをオーバーライドする必要があります。
interface Drawable { void draw(); }
インターフェースの宣言と実装
インターフェースは、interface
キーワードを用いて宣言します。以下の例では、Drawable
インターフェースを宣言し、その後にCircle
とRectangle
クラスで実装しています。
interface Drawable { void draw(); } class Circle implements Drawable { @Override public void draw() { System.out.println("Drawing a circle..."); } } class Rectangle implements Drawable { @Override public void draw() { System.out.println("Drawing a rectangle..."); } }
抽象クラスとは
抽象クラスは、一部または全部のメソッドが実装されていないクラスです。抽象メソッド(実装のないメソッド)と普通のメソッド(実装のあるメソッド)の両方を持つことができます。また、抽象クラスはインスタンス化することはできません。その代わりに、他のクラスが継承して具象クラスを作成し、メソッドを実装します。
abstract class Shape { abstract void draw(); }
抽象クラスの宣言と継承
抽象クラスは、abstract
キーワードを用いて宣言します。以下の例では、Shape
抽象クラスを宣言し、その後にCircle
とRectangle
クラスで継承しています。
abstract class Shape { abstract void draw(); } class Circle extends Shape { @Override void draw() { System.out.println("Drawing a circle..."); } } class Rectangle extends Shape { @Override void draw() { System.out.println("Drawing a rectangle..."); } }
インターフェースと抽象クラスの違い
インターフェースと抽象クラスは、いずれもクラスの設計と再利用を促すための機能ですが、それぞれに違いがあります。
- インターフェース:すべてのメソッドは抽象メソッドであり、フィールドを持つことができません(Java 8からデフォルトメソッドと静的メソッドが追加されましたが、これらは例外)。複数のインターフェースを実装することが可能。
- 抽象クラス:抽象メソッドと実装済みのメソッドを持つことができ、フィールドを持つことができます。複数の抽象クラスを継承することはできませんが、インターフェースを実装することが可能。
まとめ
本ブログでは、Javaにおけるインターフェースと抽象クラスの違いと、それぞれの使い方について説明しました。インターフェースと抽象クラスは、プログラムの設計と再利用性を向上させるための概念であり、それらを適切に利用することが重要です。これらの概念を理解し、適切な場面で活用してください。