Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
interface / implements / abstract
インターフェースと抽象クラスはどちらも「実装すべき契約」を定義する仕組みです。『interface』はメソッドのシグネチャを定義し、『implements』でそれを実装します。『abstract』クラスは一部だけ実装した中間的なクラスを定義します。
構文
// インターフェースの定義です。
interface InterfaceName {
// 抽象メソッド(実装を持たない)
戻り値型 メソッド名(引数);
// defaultメソッド(Java 8以降、デフォルト実装を持つ)
default 戻り値型 メソッド名(引数) {
// デフォルトの処理
}
// staticメソッド(Java 8以降)
static 戻り値型 メソッド名(引数) {
// 処理
}
}
// インターフェースを実装します(複数実装可)。
class MyClass implements InterfaceA, InterfaceB {
@Override
public 戻り値型 メソッド名(引数) {
// 実装
}
}
// 抽象クラスの定義です。
abstract class AbstractClass {
// 抽象メソッド(サブクラスで必ず実装する)
abstract 戻り値型 メソッド名(引数);
// 通常のメソッド(共通処理)
void commonMethod() {
// 処理
}
}
キーワード一覧
| キーワード | 概要 |
|---|---|
| interface | メソッドのシグネチャと定数を定義します。インスタンス化はできません。 |
| implements | クラスがインターフェースを実装することを宣言します。カンマ区切りで複数指定できます。 |
| abstract(クラス) | 直接インスタンス化できないクラスです。抽象メソッドを含めることができます。 |
| abstract(メソッド) | 実装を持たないメソッドです。サブクラスで必ずオーバーライドしなければなりません。 |
| default(インターフェース) | Java 8以降。インターフェース内にデフォルト実装を持つメソッドを定義します。 |
サンプルコード
// Drawableインターフェースを定義します。
interface Drawable {
void draw(); // 抽象メソッド
default String getType() { // デフォルトメソッド
return "図形";
}
}
// 抽象クラスでDrawableを部分実装します。
abstract class Shape implements Drawable {
String color;
Shape(String color) {
this.color = color;
}
// draw() は抽象メソッドのままサブクラスに委ねます。
@Override
public abstract void draw();
}
// 具象クラスで抽象メソッドを実装します。
class Circle extends Shape {
double radius;
Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
public void draw() {
System.out.println(color + "の円(半径" + radius + ")を描画しました。");
}
}
Drawable d = new Circle("赤", 5.0);
d.draw(); // 『赤の円(半径5.0)を描画しました。』と出力されます。
System.out.println(d.getType()); // 『図形』と出力されます。
// 複数のインターフェースを実装します。
interface Resizable {
void resize(double factor);
}
class Square extends Shape implements Resizable {
double side;
Square(String color, double side) { super(color); this.side = side; }
@Override public void draw() { System.out.println(color + "の正方形を描画しました。"); }
@Override public void resize(double factor) { side *= factor; }
}
概要
インターフェースは「できること」を定義する契約で、クラスは複数のインターフェースを実装できます。抽象クラスは共通の実装を持ちながら一部の処理をサブクラスに委ねる仕組みです。抽象クラスを継承できるクラスは1つだけ(単一継承)ですが、インターフェースは複数を同時に実装できます。
Java 8以降、インターフェースに default メソッドを定義できるようになったため、インターフェースと抽象クラスの違いは曖昧になってきています。状態(フィールド)を持つ共通処理が必要なら抽象クラス、型の契約だけを定義したいならインターフェースを選びます。
継承の基本については『extends / super / @Override』を、関数型インターフェースについては『Predicate / Function / Consumer / Supplier』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。