// 抽象クラス AbstractClass
abstract class AbstractClass {
// 抽象メソッドや通常のメソッドを含む
abstract void abstractMethod();
void normalMethod() {
// 通常のメソッドの実装
}
}
// インターフェイス InterfaceA
interface InterfaceA {
// InterfaceAのメソッド
void methodA();
}
// 新しいインターフェイス InterfaceB
interface InterfaceB {
// InterfaceBのメソッド
void methodB();
}
// クラス ConcreteClass
class ConcreteClass extends AbstractClass implements InterfaceA, InterfaceB {
// AbstractClassからの継承とInterfaceA、InterfaceBの実装
// インターフェイスAのメソッドの実装
@Override
public void methodA() {
// 実装
}
// インターフェイスBのメソッドの実装
@Override
public void methodB() {
// 実装
}
// AbstractClassの抽象メソッドの実装
@Override
void abstractMethod() {
// 実装
}
}
この例では、AbstractClass
が抽象メソッドと通常のメソッドを含み、InterfaceA
と InterfaceB
がそれを拡張します。最後に、ConcreteClass
が AbstractClass
を継承し、InterfaceA
と InterfaceB
を実装します。各メソッドの実装は問題に応じて追加してください。
抽象クラスとインターフェイス
抽象クラスとインターフェイスは、Javaにおいてオブジェクト指向プログラミングで使われる2つの異なる概念です。以下にそれぞれの特徴を解説します。
抽象クラス (Abstract Class):
- 抽象メソッドを含む:
- 抽象クラスは抽象メソッド(実装がないメソッド)を含むことができます。これはサブクラスで実装されることを期待するメソッドです。
- 通常のメソッドを含む:
- 抽象クラスは通常のメソッド(実装があるメソッド)も含むことができます。これらのメソッドは直接実装され、サブクラスでオーバーライドすることもあります。
- フィールドやコンストラクタを含む:
- 抽象クラスはフィールドやコンストラクタを含むことができます。
- 単一継承の制約:
- 1つの抽象クラスしか直接継承できない(単一継承)。
abstract class AbstractClass {
// 抽象メソッド
abstract void abstractMethod();
// 通常のメソッド
void normalMethod() {
// 実装
}
}
インターフェイス (Interface):
- 抽象メソッドのみ:
- インターフェイスは抽象メソッドのみを含むことができます。これはインターフェイスを実装するクラスで全てのメソッドを実装する必要があることを意味します。
- 定数を含む:
- インターフェイスは定数(
public static final
)も含むことができます。
- インターフェイスは定数(
- 複数インターフェイスの実装:
- クラスは複数のインターフェイスを同時に実装できます。
interface InterfaceA {
// 抽象メソッド
void methodA();
// 定数
int CONSTANT_A = 1;
}
interface InterfaceB {
// 抽象メソッド
void methodB();
// 定数
int CONSTANT_B = 2;
}
class ConcreteClass implements InterfaceA, InterfaceB {
// インターフェイスAのメソッドの実装
@Override
public void methodA() {
// 実装
}
// インターフェイスBのメソッドの実装
@Override
public void methodB() {
// 実装
}
}
どちらを選ぶべきか?
- 抽象クラス:
- 共通の実装を提供する必要がある場合や、継承関係にあるクラス間でフィールドを共有したい場合に適しています。
- インターフェイス:
- 異なるクラス間で共通の振る舞いを定義したい場合や、複数のクラスに同時にインターフェイスを実装させたい場合に適しています。