Java Interface Guide

トップに戻る

interface と class 継承の違いを、Java のコード例で整理する

このページは画像内の説明をもとに、Java の interfaceimplementsextends、定数、default メソッド、static メソッドの違いを読みやすくまとめたものです。

1

interface の基本

Java の interface は、クラスが実装すべきメソッドのシグネチャを定義する抽象型です。複数のクラスに同じ振る舞いを要求したいときに使います。

  • 通常のメソッドは暗黙的に public abstract です。
  • フィールドは暗黙的に public static final の定数です。
  • Java 8 以降は default メソッドと static メソッドも定義できます。
  • クラスは implements を使って、1つ以上の interface を実装できます。
java
public interface Drawable {
  void draw();
}

public class Circle implements Drawable {
  @Override
  public void draw() {
    System.out.println("円を描画");
  }
}

この例では、Drawable が「draw メソッドを持つこと」を約束し、Circle がその約束を実装しています。

2

implements と extends の違い

extends はクラスからクラスへの継承、implements は interface からクラスへの実装です。

観点 extends implements
関係 親クラスを継承する interface を実装する
多重性 Java では1つのクラスだけ継承可能 複数の interface を実装可能
メソッド 親クラスのメソッドを継承またはオーバーライドする 抽象メソッドを実装する必要がある
コンストラクタ 親クラスのコンストラクタを super() で呼び出せる interface にはコンストラクタがない
フィールド 親クラスの非 private フィールドを継承できる 定数だけを持てる
主な目的 既存クラスの機能を再利用、拡張する 共通の振る舞いを保証し、多態性を実現する
java
// extends の例
public class SubClass extends SuperClass {
  // ...
}

// implements の例
public class MyClass implements Interface1, Interface2 {
  // ...
}
まとめると、extends は「親クラスの機能を受け継ぐ」ため、implements は「決められた振る舞いを実装する」ために使います。
3

interface の定数

interface で宣言した変数は、すべて自動的に public static final になります。そのため、これらのキーワードは省略できます。

java
public interface MathConstants {
  // public static final は省略可能
  double PI = 3.14159265359;
  double E = 2.71828182846;

  // 明示的に書いてもよい
  public static final double GOLDEN_RATIO = 1.61803398875;

  int DAYS_IN_WEEK = 7;
  String GREETING = "Hello, Math!";
}
  • 定数名は慣例的に大文字で書き、単語はアンダースコアで区切ります。
  • intdouble などのプリミティブ型だけでなく、String などのオブジェクト型も定数にできます。
  • 実装クラスや他クラスから、interface 名を使って直接アクセスできます。
java
public class MathOperations implements MathConstants {
  public double calculateCircleArea(double radius) {
    return PI * radius * radius;
  }
}

public class Main {
  public static void main(String[] args) {
    System.out.println("円周率: " + MathConstants.PI);
    System.out.println("自然対数の底: " + MathConstants.E);
  }
}
4

メソッドに default は必要か

通常の interface メソッドには default を付けません。通常のメソッドは抽象メソッドとして扱われ、実装クラス側で必ず実装します。

通常のメソッド

default は不要です。暗黙的に public abstract となり、実装クラスでオーバーライドします。

default メソッド

interface 内で実装を持てます。既存の実装クラスを壊さずに、新しい振る舞いを追加したいときに便利です。

java
public interface MyInterface {
  // 通常の抽象メソッド。default は不要
  void regularMethod();

  // デフォルトメソッド
  default void defaultMethod() {
    System.out.println("This is a default method");
  }

  // 静的メソッド
  static void staticMethod() {
    System.out.println("This is a static method");
  }
}

public class MyClass implements MyInterface {
  @Override
  public void regularMethod() {
    System.out.println("Implemented regular method");
  }
}
5

default と static の違い

default メソッドと static メソッドはどちらも Java 8 から使えますが、呼び出し方と継承のされ方が違います。

観点 default static
定義 インスタンスメソッドとして実装を持つ クラスメソッドとして interface に所属する
呼び出し 実装クラスのオブジェクトから呼び出す interface 名から直接呼び出す
オーバーライド 実装クラスでオーバーライド可能 オーバーライド不可
this 使用可能 使用不可
他メソッドの呼び出し 同じ interface 内の抽象メソッドや default メソッドを呼べる 他の static メソッドだけを呼べる
継承 サブ interface に継承され、再定義もできる 継承されない。同名メソッドを定義しても別の static メソッドになる
java
public interface MyInterface {
  void abstractMethod();

  default void defaultMethod() {
    System.out.println("Default method in MyInterface");
    abstractMethod();
  }

  static void staticMethod() {
    System.out.println("Static method in MyInterface");
  }
}

public class MyClass implements MyInterface {
  @Override
  public void abstractMethod() {
    System.out.println("Implemented abstract method");
  }

  // default メソッドは必要に応じてオーバーライドできる
  @Override
  public void defaultMethod() {
    System.out.println("Overridden default method in MyClass");
  }
}

public class Main {
  public static void main(String[] args) {
    MyClass obj = new MyClass();
    obj.defaultMethod();
    obj.abstractMethod();

    MyInterface.staticMethod();
  }
}
設計上は、default は既存 interface に後から機能を足すため、static は interface に関連するユーティリティ処理をまとめるために使うと整理しやすくなります。