🙄

Java Silver 勉強⑥継承による実装の再利用

に公開

【出題項目の例】

  • Javaの基本データ型と文字列の操作
  • 演算子と制御構造
  • 配列の操作
  • クラスの宣言とインスタンスの使用
  • メソッドの作成と使用
  • カプセル化の適用
  • 継承による実装の再利用
  • インタフェースによる抽象化
  • 例外処理
  • モジュール・システム

継承による実装の再利用

1. 継承の基本

Java では extends キーワードを使って、既存のクラス(親クラス)を継承できます。
継承したクラス(子クラス)は、親クラスのフィールドメソッドを引き継ぐことができます。

// 親クラス(スーパークラス)
class Animal {
    String name = "動物";

    void makeSound() {
        System.out.println("何かの音を出す");
    }
}

// 子クラス(サブクラス)
class Dog extends Animal {
    void bark() {
        System.out.println("ワンワン!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog.name); // 親クラスのフィールドを継承
        dog.makeSound();  // 親クラスのメソッドを継承
        dog.bark();       // 子クラス独自のメソッド
    }
}

実行結果

動物
何かの音を出す
ワンワン!

2. メソッドのオーバーライド(Override)

親クラスのメソッドを子クラスで上書き(オーバーライドすることができます。
オーバーライドする際は、@Override アノテーションを付けるのが一般的です。

class Animal {
    void makeSound() {
        System.out.println("動物の音");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("ワンワン!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.makeSound(); // 動物の音

        Dog dog = new Dog();
        dog.makeSound(); // ワンワン!(オーバーライドされたメソッド)
    }
}

3. コンストラクタと super

  • 子クラスのコンストラクタでは、親クラスのコンストラクタを super で呼び出すことができます。
  • 親クラスに引数ありのコンストラクタがある場合、子クラスで super(引数) を必ず呼ぶ必要があります。
class Animal {
    String name;

    // 親クラスのコンストラクタ
    Animal(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    Dog(String name) {
        super(name);  // 親クラスのコンストラクタを呼ぶ
    }

    void showName() {
        System.out.println("犬の名前: " + name);
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("ポチ");
        dog.showName(); // 犬の名前: ポチ
    }
}

4. final の使い方

final キーワードを使うと、継承やオーバーライドを制限できます。

4-1 final クラス

final をクラスにつけると、そのクラスは継承できなくなる。

final class Animal { } // これを継承しようとするとコンパイルエラー

// class Dog extends Animal { } // ❌ エラー!

4-2 final メソッド

final をメソッドにつけると、そのメソッドはオーバーライドできなくなる。

class Animal {
    final void makeSound() {
        System.out.println("動物の音");
    }
}

class Dog extends Animal {
    // void makeSound() { // ❌ エラー!
    //    System.out.println("ワンワン!");
    // }
}

5. instanceof を使った型の判定

継承を使ってオブジェクトの型を判定することもできます。

class Animal { }
class Dog extends Animal { }

public class Main {
    public static void main(String[] args) {
        Animal a = new Dog();  // Dog型をAnimal型として扱う(アップキャスト)

        if (a instanceof Dog) {
            System.out.println("a は Dog 型です");
        }
    }
}

実行結果

a は Dog 型です

ポイント

項目 説明
extends 親クラスを継承するときに使用
メソッドのオーバーライド 親クラスのメソッドを上書き(@Override を使う)
super() 親クラスのコンストラクタを呼ぶ
final クラス 継承できなくする
final メソッド オーバーライドできなくする
instanceof あるオブジェクトが特定の型かどうかを判定

Discussion