// 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
メソッドの基本的な特徴と使用例です。
- オーバーライド禁止:
final
修飾子が付いたメソッドは、サブクラスでオーバーライドできません。これにより、親クラスで特定の振る舞いを持つメソッドが、サブクラスによって変更されることを防ぎます。 - 安定性の確保:
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修飾子が異なるコンテキストで使用される方法を示しています。