Javaのfinalメソッドは継承できる?オーバーライドとの違いを解説
結論:finalメソッドは「継承される」が「オーバーライドできない」
Javaにおいて、finalキーワードが付いたメソッドは、サブクラスに継承されます。つまり、子クラスから親クラスのfinalメソッドをそのまま呼び出すことが可能です。
ただし、finalメソッドはオーバーライド(上書き)することができません。サブクラスで同じシグネチャのメソッドを再定義しようとすると、コンパイルエラーが発生します。
コード例で確認
class Parent {
public final void display() {
System.out.println("親クラスのメソッド");
}
}
class Child extends Parent {
// display() は継承されているので呼び出し可能
// ただし、以下のようにオーバーライドするとコンパイルエラー
/*
@Override
public void display() { // エラー:finalメソッドはオーバーライド不可
System.out.println("子クラスのメソッド");
}
*/
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.display(); // 「親クラスのメソッド」と出力される
}
}
finalメソッドを使うメリット
- 意図しない変更を防ぐ:重要なビジネスロジックやセキュリティに関わる処理が、サブクラスで勝手に書き換えられるのを防止できます。
- 動作の一貫性を保証:クラス設計者が意図した振る舞いを、継承階層全体で確実に保てます。
- 最適化の余地:JVMがメソッドのインライン化などの最適化を行いやすくなる場合があります(現代のJITコンパイラでは効果は限定的です)。
finalクラスとの違いに注意
クラス自体にfinalを付けた場合(finalクラス)は、そのクラス自体が継承できなくなります。一方、メソッドにfinalを付けた場合は「継承はできるが、オーバーライドは不可」という点が異なります。この違いを混同しないようにしましょう。
まとめ
Javaのfinalメソッドは継承は可能ですが、オーバーライドは不可能です。「呼び出して使うことはできるが、書き換えることはできない」と覚えておくと良いでしょう。
-
JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説
invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。
-
JavaでJPanelのpaintComponent()メソッドを実装する方法をわかりやすく解説
JPanelはJavaにおける軽量コンテナであり、それ自体は不可視(インビジブル)なコンポーネントとして扱われます。デフォルトのレイアウトにはFlowLayoutが採用されています。JPanelを生成した後は、Containerクラスから継承されたadd()メソッドを呼び出すことで、ボタンやラベルなどの他のコンポーネントをJPanelオブジェクトに自由に追加できます。 paintComponent()メソッドとは このメソッドは、単なる背景色の描画にとどまらず、JPanel上に独自の図形や画像などを描画したい場合に必要となります。paintComponent()メソッドはすでにJPanelクラ