014 継承(finalメソッド) 034 解答例

// Person クラス
public class Person {
    // final修飾子を持つメソッド
    public final void displayInfo() {
        System.out.println("個人情報を表示します");
    }
}

// Person クラスを継承したサブクラス
public class Employee extends Person {
    // オーバーライドしようとしてもコンパイルエラーが発生する
    // final修飾子を持つメソッドはオーバーライドできない
    // @Override
    // public void displayInfo() {
    //     System.out.println("従業員情報を表示します");
    // }
}

この例では、PersonクラスのdisplayInfoメソッドにfinal修飾子が付いています。そのため、Employeeクラスでこのメソッドをオーバーライドしようとすると、コメントアウトされた部分のようにコンパイルエラーが発生します。これにより、final修飾子がメソッドのオーバーライドを禁止する効果が確認できます。

finalメソッド

finalメソッドは、そのメソッドがオーバーライドできないことを示す修飾子です。final修飾子が付いたメソッドは、サブクラスで同じ名前のメソッドを定義してオーバーライドすることができません。これにより、クラスデザインの安定性を確保し、サブクラスが特定のメソッドを変更できないようにします。

以下は、finalメソッドの基本的な特徴と使用例です。

  1. オーバーライド禁止: final修飾子が付いたメソッドは、サブクラスでオーバーライドできません。これにより、親クラスで特定の振る舞いを持つメソッドが、サブクラスによって変更されることを防ぎます。
  2. 安定性の確保: finalメソッドは、そのクラスの挙動を安定させるために使用されます。クラスの作者が特定のメソッドが変更されないようにしたい場合に、finalメソッドが有用です。

以下は、finalメソッドの例です。

public class Parent {
    // finalメソッド
    public final void finalMethod() {
        System.out.println("This is a final method in the Parent class.");
    }
}

public class Child extends Parent {
    // コンパイルエラーが発生するためコメントアウト
    // @Override
    // public void finalMethod() {
    //     System.out.println("This method cannot be overridden in the Child class.");
    // }
}

上記の例では、ParentクラスのfinalMethodメソッドがfinal修飾子を持っています。そのため、Childクラスで同じ名前のメソッドをオーバーライドしようとすると、コンパイルエラーが発生します。これにより、finalメソッドがオーバーライドできないことが確認できます。

メソッド以外に使われるfinal修飾子

final修飾子は、メソッドだけでなく、他の要素にも適用することができます。以下は、メソッド以外でのfinal修飾子の解説です。

フィールド (変数):

クラスのフィールド(メンバ変数)にfinal修飾子を付けることができます。これにより、そのフィールドの値が一度設定されたら変更できなくなります。

public class MyClass {
    // finalフィールド
    public final int constantValue = 10;

    public void modifyValue() {
        // コンパイルエラーが発生するためコメントアウト
        // constantValue = 20;
    }
}

上記の例では、constantValueはfinal修飾子を持っているため、一度設定された値(ここでは10)は変更できません。

クラス:

final修飾子はクラス自体にも適用できます。final修飾子が付いたクラスは継承できません。これは、そのクラスの機能やデザインを変更できないようにするために使用されます。

// finalクラス
public final class FinalClass {
    // クラスの内容
}

上記の例では、FinalClassはfinal修飾子を持っているため、他のクラスはこれを継承できません。

ローカル変数:

メソッド内のローカル変数にもfinal修飾子を使用できます。これにより、変数が一度初期化された後に再代入できなくなります。

public class MyClass {
    public void exampleMethod() {
        // finalローカル変数
        final int localVar = 5;

        // コンパイルエラーが発生するためコメントアウト
        // localVar = 10;
    }
}

上記の例では、localVarはfinal修飾子を持っているため、初期化後に再代入できません。

これらの例は、final修飾子が異なるコンテキストで使用される方法を示しています。

「014 継承」問題集リスト