Javaでインターフェイスが別のインターフェイスを実装できない理由とは?
Javaでは、インターフェイスが別のインターフェイスを実装(implements)することはできません。この記事では、その理由と正しい継承方法について、コード例を交えて解説します。
インターフェイスの基本
- Javaにおけるインターフェイスは、本質的に特殊な種類のクラスです。クラスと同様にメソッドや変数を持ちますが、クラスと異なり、常に完全に抽象的(abstract)であるという特徴があります。
- インターフェイスは、
classキーワードの代わりにinterfaceキーワードを使用する点以外は、クラスとほぼ同じように定義します。インターフェイス内で宣言された変数は自動的にstaticかつfinalとなり、定義されるメソッドはpublic abstractメソッドとして扱われます。 - インターフェイスはextendsキーワードを使えば、いくつでも他のインターフェイスを継承できます。しかし、あるインターフェイスが別のインターフェイスをimplementsすることはできません。これは、インターフェイスを実装した場合、そのメソッドの具体的な定義(処理本体)を提供する必要がある一方で、インターフェイス自体は決してメソッドの実装を持たないためです。
- 仮にインターフェイス同士でimplementsを使用しようとすると、Javaではコンパイル時エラーが発生します。
コード例
interface MainInterface {
void mainMethod();
}
interface SubInterface extends MainInterface { // extends の代わりに implements を書くと、
// コンパイラがエラーを出力します。
void subMethod();
}
class MainClass implements MainInterface {
public void mainMethod() {
System.out.println("Main Interface Method");
}
public void subMethod() {
System.out.println("Sub Interface Method");
}
}
public class Test {
public static void main(String args[]) {
MainClass main = new MainClass();
main.mainMethod();
main.subMethod();
}
}
出力結果
Main Interface Method Sub Interface Method
ポイントまとめ
- インターフェイス → インターフェイス:
extendsを使用(多重継承も可能) - クラス → インターフェイス:
implementsを使用し、すべての抽象メソッドを実装する必要がある - インターフェイスはメソッドの「宣言」のみを持ち、実装を持たないため、implementsによる実装関係は成立しない
このように、インターフェイス間の関係は必ずextendsで表現するのがJavaのルールです。設計時にこの違いを理解しておくことで、コンパイルエラーを防ぎ、より明確な抽象化を行えます。
-
Javaのインターフェースとは?基本構文からクラスとの違いまで徹底解説
Javaのインターフェースとはインターフェースは、Javaにおける参照型の一つで、クラスとよく似た性質を持っています。その本体は抽象メソッドの集まりであり、クラスがインターフェースを実装することで、その抽象メソッドを引き継ぐ仕組みになっています。抽象メソッドに加えて、インターフェースには定数、デフォルトメソッド、静的メソッド、ネストされた型を含めることも可能です。ただし、メソッドの本体(処理内容)が存在するのは、デフォルトメソッドと静的メソッドのみです。インターフェースの記述方法はクラスと似ていますが、両者の役割は異なります。クラスがオブジェクトの属性や振る舞いを記述するのに対し、インターフェ
-
Javaでコンストラクターにfinalを付けられない理由を解説
finalキーワードの役割とは Javaにおけるfinalキーワードは、メソッドがサブクラスでオーバーライドされることを防ぐために使用されます。finalが付いたメソッドは、たとえ継承関係にあっても子クラス側で再定義することはできません。 コンストラクターはオーバーライドできない 一方、コンストラクターはそもそもオーバーライドの対象になりません。その理由は、コンストラクターが継承されないためです。 サブクラスはスーパークラスのコンストラクターを受け継ぐことができず、必ず独自のコンストラクターを定義します。オーバーライドという概念自体が成立しない以上、それを禁止するためのfinalを付ける意味