🧠
Javaオブジェクト指向の要点整理【ポリモーフィズム・オーバーライド・バインディング】
instanceof
、インタフェース
Javaオブジェクト指向の要点整理:ポリモーフィズム、オーバーライド、動的バインディング、✅ ポリモーフィズム(Polymorphism)
一つの親型で複数の子オブジェクトを扱える性質
コードの柔軟性、拡張性が向上
Animal a = new Dog();
a.sound(); // "ワンワン" を出力(実際のオブジェクトに基づいて実行)
✅ オーバーライド(Overriding)
子クラスが親クラスのメソッドを再定義すること
メソッド名、引数、戻り値の型がすべて同じである必要がある
class Animal {
void sound() { System.out.println("動物の音"); }
}
class Dog extends Animal {
@Override
void sound() { System.out.println("ワンワン"); }
}
✅ 動的バインディング(Dynamic Binding)
実行時に実際のオブジェクトに基づいてメソッドが呼び出される仕組み
オーバーライドされたメソッドにのみ適用される
Animal a = new Dog(); // 変数の型はAnimal、実際のオブジェクトはDog
a.sound(); // Dogのsound()が実行される(動的バインディング)
✅ instanceof演算子
オブジェクトが特定のクラスのインスタンスかどうかを確認する演算子
安全なダウンキャストのために使用される
if (a instanceof Dog) {
((Dog)a).bark(); // 安全に子クラスの機能を使用
}
✅ instanceofの欠点
- クラス数が増えると
if
文の乱用につながる - OCP(開放-閉鎖原則)に違反
- 保守性が低下
➡ 解決策:オーバーライド + ポリモーフィズム
✅ インタフェース(interface)
機能だけを宣言し、実装は各クラスに任せる設計図
interface Animal {
void sound();
}
class Dog implements Animal {
public void sound() {
System.out.println("ワンワン");
}
}
Animal a = new Dog();
a.sound(); // "ワンワン"
✅ インタフェース vs クラスの違い
項目 | クラス(class) | インタフェース(interface) |
---|---|---|
目的 | 機能の実装 | 機能の仕様(約束) |
メソッド | 実装を含むことが可能 | 宣言のみ |
複数実装 | 不可 | 可(複数のimplementsが可能) |
✅ 結論まとめ
- ポリモーフィズム + オーバーライド → 実行時に動作が決定(動的バインディング)
-
instanceof
は子クラスの機能にアクセスするために使うが、乱用は避ける - インタフェースは「機能の約束事」として、より柔軟なポリモーフィズムの活用が可能
Discussion