通常のメソッド
default は不要です。暗黙的に public abstract となり、実装クラスでオーバーライドします。
Java Interface Guide
このページは画像内の説明をもとに、Java の interface、implements、extends、定数、default メソッド、static メソッドの違いを読みやすくまとめたものです。
Java の interface は、クラスが実装すべきメソッドのシグネチャを定義する抽象型です。複数のクラスに同じ振る舞いを要求したいときに使います。
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
@Override
public void draw() {
System.out.println("円を描画");
}
}
この例では、Drawable が「draw メソッドを持つこと」を約束し、Circle がその約束を実装しています。
extends はクラスからクラスへの継承、implements は interface からクラスへの実装です。
| 観点 | extends | implements |
|---|---|---|
| 関係 | 親クラスを継承する | interface を実装する |
| 多重性 | Java では1つのクラスだけ継承可能 | 複数の interface を実装可能 |
| メソッド | 親クラスのメソッドを継承またはオーバーライドする | 抽象メソッドを実装する必要がある |
| コンストラクタ | 親クラスのコンストラクタを super() で呼び出せる | interface にはコンストラクタがない |
| フィールド | 親クラスの非 private フィールドを継承できる | 定数だけを持てる |
| 主な目的 | 既存クラスの機能を再利用、拡張する | 共通の振る舞いを保証し、多態性を実現する |
// extends の例
public class SubClass extends SuperClass {
// ...
}
// implements の例
public class MyClass implements Interface1, Interface2 {
// ...
}
interface で宣言した変数は、すべて自動的に public static final になります。そのため、これらのキーワードは省略できます。
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!";
}
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);
}
}
通常の interface メソッドには default を付けません。通常のメソッドは抽象メソッドとして扱われ、実装クラス側で必ず実装します。
default は不要です。暗黙的に public abstract となり、実装クラスでオーバーライドします。
interface 内で実装を持てます。既存の実装クラスを壊さずに、新しい振る舞いを追加したいときに便利です。
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");
}
}
default メソッドと static メソッドはどちらも Java 8 から使えますが、呼び出し方と継承のされ方が違います。
| 観点 | default | static |
|---|---|---|
| 定義 | インスタンスメソッドとして実装を持つ | クラスメソッドとして interface に所属する |
| 呼び出し | 実装クラスのオブジェクトから呼び出す | interface 名から直接呼び出す |
| オーバーライド | 実装クラスでオーバーライド可能 | オーバーライド不可 |
| this | 使用可能 | 使用不可 |
| 他メソッドの呼び出し | 同じ interface 内の抽象メソッドや default メソッドを呼べる | 他の static メソッドだけを呼べる |
| 継承 | サブ interface に継承され、再定義もできる | 継承されない。同名メソッドを定義しても別の static メソッドになる |
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();
}
}