interface / implements / abstract
| 対応: | Java 1.0(1996) |
|---|
インターフェースと抽象クラスはどちらも「実装すべき契約」を定義する仕組みです。『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以降。インターフェース内にデフォルト実装を持つメソッドを定義します。 |
サンプルコード
sample_InterfaceAbstract.java
interface Drawable {
void draw();
default String getType() {
return "図形";
}
}
interface Resizable {
void resize(double factor);
}
abstract class Shape implements Drawable {
String color;
Shape(String color) {
this.color = color;
}
@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 + ")を描画しました。");
}
}
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; }
}
class InterfaceAbstract {
public static void main(String[] args) {
// Drawableインターフェースを通して操作します
Drawable d = new Circle("赤", 5.0);
d.draw();
System.out.println(d.getType());
// 複数のインターフェースを実装したクラスを使います
Square sq = new Square("青", 3.0);
sq.draw();
sq.resize(2.0);
System.out.println(sq.side);
}
}
InterfaceAbstract.java
javac InterfaceAbstract.java java InterfaceAbstract 赤の円(半径5.0)を描画しました。 図形 青の正方形を描画しました。 6.0
概要
インターフェースは「できること」を定義する契約で、クラスは複数のインターフェースを実装できます。抽象クラスは共通の実装を持ちながら一部の処理をサブクラスに委ねる仕組みです。抽象クラスを継承できるクラスは1つだけ(単一継承)ですが、インターフェースは複数を同時に実装できます。
Java 8以降、インターフェースに default メソッドを定義できるようになったため、インターフェースと抽象クラスの違いは曖昧になってきています。状態(フィールド)を持つ共通処理が必要なら抽象クラス、型の契約だけを定義したいならインターフェースを選びます。
継承の基本については『extends / super / @Override』を、関数型インターフェースについては『Predicate / Function / Consumer / Supplier』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。