// Runnable インターフェイスの宣言
interface Runnable {
void run();
}
// Animal クラスの宣言と Runnable インターフェイスの実装
public class Animal implements Runnable {
// makeSound メソッドの宣言
void makeSound() {
// 適切な実装
}
// run メソッドの実装 (Runnable インターフェイスの実装)
@Override
public void run() {
// 適切な実装
}
}
// Dog クラスの宣言と Animal クラスの継承
public class Dog extends Animal {
// makeSound メソッドのオーバーライド
@Override
void makeSound() {
System.out.println("Woof!");
}
// run メソッドの実装 (Runnable インターフェイスの実装)
@Override
public void run() {
System.out.println("Running like a dog.");
}
}
この例では、Animal クラスが Runnable インターフェイスを実装し、Dog クラスが Animal クラスを継承しています。また、Dog クラスは makeSound メソッドをオーバーライドし、「Woof!」と表示します。run メソッドも Runnable インターフェイスの実装に従い、「Running like a dog.」と表示します。
インターフェイスの実装とクラスの継承の同時利用
柔軟なクラス設計:
- インターフェイスの実装とクラスの継承を同時に利用することで、クラスは異なる側面や振る舞いを持つことができます。
- 例えば、動物(
Animal)クラスが鳴くことと同時に走ることができるようにしたい場合、インターフェイスの実装とクラスの継承を組み合わせることが有益です。
2. 具象クラスとインターフェイス:
- 具象クラスはインターフェイスを実装し、同時に他のクラスを継承することができます。
- 具象クラスは、継承によって既存のクラスの機能を取り入れつつ、インターフェイスの実装によって新しい振る舞いや契約を持つことができます。
3. 例:
interface Runnable {
void run();
}
class Animal {
void makeSound() {
System.out.println("Generic animal sound");
}
}
class Dog extends Animal implements Runnable {
@Override
void makeSound() {
System.out.println("Woof!");
}
@Override
public void run() {
System.out.println("Running like a dog.");
}
}
AnimalクラスはmakeSoundメソッドを持つが、Dogクラスはこれをオーバーライドして独自の「Woof!」という鳴き声に変更しています。- 同時に
DogクラスはRunnableインターフェイスを実装し、runメソッドを追加しています。これにより、DogクラスはAnimalクラスの特性を持ちつつ、Runnableインターフェイスの要件を満たすことができます。
4. メリット:
- インターフェイスの実装とクラスの継承を同時に使用することで、異なるクラス間でのコードの共有と再利用が容易になります。
- クラスが複数の側面を持ち、それぞれの側面が異なるクラス階層で階層化されるような柔軟で再利用可能な設計が可能です。
このような設計の柔軟性は、特に大規模で複雑なアプリケーションの開発やメンテナンスにおいて重要です。
実習で理解を深めよう / Practice to deepen your understanding
この内容についてJavaDrillで実際に手を動かして学習できます
Practice with JavaDrill to learn hands-on


