継承の基本概念
継承はオブジェクト指向プログラミングの核となる仕組みの一つです。主な目的は以下の通りです:
- コードの再利用
- メソッドのオーバーライドと多態を実現するための基盤
Javaでの継承は以下のような構文を使用します:
class 派生クラス extends 基底クラス {
// クラス本体
}
特徴:
- Javaは単一継承のみをサポート
- privateメンバとコンストラクタは継承されない
- 明示的な継承が指定されない場合、
java.lang.Objectが暗黙的に継承される
継承の実装例
class Base {
public void execute() {
System.out.println("ベースクラスの実行");
}
}
class Middle extends Base {}
class Derived extends Middle {}
public class InheritanceDemo {
public static void main(String[] args) {
Derived obj = new Derived();
obj.execute(); // Baseクラスから継承されたメソッド
}
}
メソッドのオーバーライド
オーバーライドとは、サブクラスがスーパークラスのメソッドを再定義することを指します。以下の条件を満たす必要があります:
- 同じメソッド名・パラメータリスト
- 同じ戻り値の型
- アクセス修飾子はより狭くできない
- 例外はスーパークラスより多くスローできない
具体的な実装例
class Vehicle {
public void move() {
System.out.println("車両が移動します");
}
}
class Car extends Vehicle {
@Override
public void move() {
System.out.println("車が走ります");
}
}
class Airplane extends Vehicle {
@Override
public void move() {
System.out.println("飛行機が飛びます");
}
}
public class OverrideDemo {
public static void main(String[] args) {
Vehicle v1 = new Vehicle();
v1.move();
Vehicle v2 = new Car();
v2.move();
Vehicle v3 = new Airplane();
v3.move();
}
}
多態の仕組み
多態の主な利点:
- プログラムの結合度を低下
- 拡張性の向上
型変換の種類
- アップキャスト(自動型変換):
Sub → Super - ダウンキャスト(明示的型変換):
Super → Sub(instanceofによるチェックが必要)
安全なダウンキャストの実装
class Animal {
public void makeSound() {
System.out.println("動物の音");
}
}
class Dog extends Animal {
public void bark() {
System.out.println("ワンワン");
}
}
public class PolymorphismDemo {
public static void main(String[] args) {
Animal pet = new Dog();
pet.makeSound();
if (pet instanceof Dog) {
Dog myDog = (Dog)pet;
myDog.bark();
}
}
}
実行時バインディングの動作
- コンパイル時:変数の型に基づく静的バインディング
- 実行時:実際のオブジェクトに基づく動的バインディング