Javaのクラスとインターフェースの違いを徹底解説!初心者にもわかる比較ガイド
Javaプログラミングにおいて、「クラス」と「インターフェース」はどちらもオブジェクト指向設計の中核を担う重要な概念です。しかし、両者の役割や使い方には明確な違いがあり、これを正しく理解することは、柔軟で保守性の高いコードを書くための第一歩となります。
本記事では、クラスとインターフェースそれぞれの基本から、両者の具体的な違いまで、コード例を交えながらわかりやすく解説します。
クラス(Class)とは
クラスとは、個々のオブジェクトを生成するための「設計図(ブループリント)」です。クラスの中には、以下のような種類の変数を定義できます。
- ローカル変数:メソッド、コンストラクタ、ブロックの中で定義される変数です。宣言と初期化はそのメソッド内で行われ、メソッドの処理が完了すると破棄されます。
- インスタンス変数:クラスの中にありながら、メソッドの外側で定義される変数です。クラスがインスタンス化されるタイミングで初期化され、そのクラス内の任意のメソッド、コンストラクタ、ブロックからアクセスできます。
- クラス変数:staticキーワードを使って、メソッドの外側で宣言された変数です。すべてのインスタンス間で値が共有される点が特徴です。
インターフェース(Interface)とは
インターフェースはJavaにおける参照型の一つで、見た目はクラスに似ていますが、主に抽象メソッドのコレクションとして定義されます。クラスがインターフェースを実装(implements)することで、そのインターフェースが持つ抽象メソッドを受け継ぐことになります。
抽象メソッドに加えて、インターフェースには定数、デフォルトメソッド、静的メソッド、ネストされた型を含めることも可能です。ただし、メソッド本体を持てるのはデフォルトメソッドと静的メソッドのみです。
インターフェースの記述方法はクラスと似ていますが、役割は異なります。クラスがオブジェクトの「属性」と「振る舞い」を記述するのに対し、インターフェースはクラスが実装すべき「振る舞い」だけを定義します。
クラスとインターフェースの主な違い
ここからは、クラスとインターフェースの重要な違いを比較表で確認していきましょう。
| No. | 項目 | クラス | インターフェース |
|---|---|---|---|
| 1 | サポートされるメソッド | 抽象メソッドと具象メソッドの両方を持つことができる。 | 原則として抽象メソッドのみ。ただしJava 8以降はデフォルトメソッドや静的メソッドも持てる。 |
| 2 | 多重継承 | 多重継承はサポートされていない。 | 複数のインターフェースを実装でき、事実上の多重継承が可能。 |
| 3 | サポートされる変数 | final・非final、static・非staticのすべての変数をサポート。 | staticかつfinalの変数(定数)のみ許可される。 |
| 4 | 実装 | インターフェースを実装できる。 | インターフェースは別のインターフェースを実装できない。拡張(extends)のみ可能。 |
| 5 | キーワード | classキーワードで宣言する。 | interfaceキーワードで宣言する。 |
| 6 | 継承の対象 | extendsキーワードで他のクラスを継承し、さらにインターフェースを実装できる。 | 継承できるのはインターフェースのみ。 |
| 7 | 継承・実装の方法 | extendsキーワードによって継承される。 | implementsキーワードによって実装される。 |
| 8 | アクセス修飾子 | privateやpublicなど、任意のアクセス修飾子を持つメンバーを定義できる。 | メンバーはpublicのみ。 |
| 9 | コンストラクタ | コンストラクタを定義できる。 | コンストラクタを持つことはできない。 |
クラスとインターフェースのサンプルコード
それでは、実際のコードでクラスとインターフェースの関係を見てみましょう。次の例では、AnimalインターフェースをTigerクラスが実装しています。
JavaTester.java
public class JavaTester {
public static void main(String args[]) {
Animal tiger = new Tiger();
tiger.eat();
Tiger tiger1 = new Tiger();
tiger1.eat();
}
}
interface Animal {
public void eat();
}
class Tiger implements Animal {
public void eat(){
System.out.println("Tiger eats");
}
}実行結果
Tiger eats Tiger eats
この例では、Animalインターフェースがeat()という抽象メソッドを定義し、Tigerクラスがそれを実装しています。注目すべきは、インターフェース型の変数(Animal tiger)でも、実装クラス型の変数(Tiger tiger1)でも、同じeat()メソッドを呼び出せる点です。これはポリモーフィズム(多態性)の基本的な活用例といえます。
まとめ
クラスはオブジェクトの設計図であり、状態(変数)と振る舞い(メソッド)の両方を持つのに対し、インターフェースはクラスに課す「契約」のようなもので、実装すべきメソッドのシグネチャを定義します。
- 共通の振る舞いを複数のクラスに持たせたい場合はインターフェース
- データと処理をひとまとめにしてオブジェクトを生成したい場合はクラス
このように目的に応じて使い分けることで、疎結合で拡張性の高いJavaプログラムを設計できます。ぜひ実際のコーディングでも意識してみてください。
-
Javaのイベントリスナーインターフェースとイベントアダプタクラスの違いを解説
EventListener(イベントリスナー)インターフェースは、特定の種類のイベントを処理するために、イベントハンドラ側で実装すべきメソッドを定義するものです。一方、イベントアダプタ(Event Adapter)クラスは、EventListenerインターフェースのデフォルト実装を提供する抽象クラスです。本記事では、それぞれの特徴と具体的なコード例をもとに、両者の違いと使い分けのポイントを解説します。 イベントリスナー(EventListener)とは イベントリスナーは、すべてのコンポーネントがイベントを処理するための中核となる仕組みです。 EventListenerインターフェースの
-
Javaのインターフェースとは?基本構文からクラスとの違いまで徹底解説
Javaのインターフェースとはインターフェースは、Javaにおける参照型の一つで、クラスとよく似た性質を持っています。その本体は抽象メソッドの集まりであり、クラスがインターフェースを実装することで、その抽象メソッドを引き継ぐ仕組みになっています。抽象メソッドに加えて、インターフェースには定数、デフォルトメソッド、静的メソッド、ネストされた型を含めることも可能です。ただし、メソッドの本体(処理内容)が存在するのは、デフォルトメソッドと静的メソッドのみです。インターフェースの記述方法はクラスと似ていますが、両者の役割は異なります。クラスがオブジェクトの属性や振る舞いを記述するのに対し、インターフェ