Javaプログラムにおけるfinal修飾子とは【初心者向け】
初心者向けにJavaプログラムにおけるfinal修飾子の使い方について詳しく解説しています。クラス、メソッド、変数にfinal修飾子を付与する書き方を説明しています。実際にサンプルプログラムも書いているので、ぜひ参考にしてみてください。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
この記事では、Javaプログラムのfinal修飾子を説明します。
final修飾子は、クラス・メソッド・変数の不変性を示します。対象の予期せぬ変更を防ぐために用います。
なお本記事は、TechAcademyのJava講座の内容をもとに作成しています。

今回はfinal修飾子を使ってみようか。

田島メンター!final修飾子は何をするんですか~?

これを付けた対象を、上書きできない状態にすることができるんだ。使い方を見てみよう。

お願いします!
final修飾子の書き方
final修飾子の付け方には、クラス、メソッド、変数に付ける3パターンがあります。
クラスにfinal修飾子を付与する
- 以下のようにclassキーワードの前にfinal修飾子を記述します。
- final修飾子を付けたクラスは継承できません。
final class MyClass {
  // 略
}
以下のような理由でクラスをfinal修飾します。
- マルチスレッドプログラムで、不変なクラスを作成したい場合。スレッド間での共有データに対する競合を防ぎます。
- staticメソッドだけを含むユーティリティクラスを作成する場合。
- 特定のクラスが実行速度のボトルネックになっている場合。JVM(Java仮想マシン)でオブジェクトの取扱が容易になるので、実行速度が向上します。
メソッドにfinal修飾子を付与する
以下のようにメソッド名の前にfinal修飾子を記述します。
final修飾子を付けたメソッドは子クラスでオーバーライド(※)できません。
(※)子クラスで、親クラスのメソッドを再定義(上書き)すること。
class MyClass {
  final myMethod(){
    // 略
  }
}
あるメソッドの動作がそのクラスにとってクリティカルで、子クラスで動作を変更されると問題が生じる場合に、メソッドをfinal修飾します。
変数にfinal修飾子を付与する
以下のように変数名の前にfinal修飾子を記述します。
final修飾子を付けると定数になります。(変更できません)
class MyClass {
  void myMethod(){
    final int a = 0;
  }
}
プログラム中で変更すべきでない値を宣言する場合に、変数をfinal修飾します。

final修飾子の基本の書き方になるよ。

クラスの他に、メソッドや変数に付けることもできるんですね。

次は実際に、final修飾子を付与して動作を確認してみよう。
実際に書いてみよう
クラスにfinal修飾子を付与する
ソースコード
final class MyClass {
}
class MySubClass extends MyClass {
}
実行結果
以下のメッセージでコンパイルエラーになりました。
FinalClassDemo.java:4: error: cannot inherit from final MyClass
class MySubClass extends MyClass {
                         ^
1 error
解説
エラーメッセージの通り、final修飾子を付けたクラスは継承できません。
メソッドにfinal修飾子を付与する
ソースコード
class MyClass {
  final public void myMethod() {
  }
}
class MySubClass extends MyClass {
  public void myMethod() {
  }
}
実行結果
以下のメッセージでコンパイルエラーになりました。
FinalMethodDemo.java:7: error: myMethod() in MySubClass cannot override myMethod() in MyClass
        public void myMethod() {
                    ^
  overridden method is final
1 error
解説
エラーメッセージの通り、final修飾子を付けたメソッドはオーバーライドできません。
変数にfinal修飾子を付与する
ソースコード
class MyClass {
  void myMethod() {
    final int a = 0;
    a = 1;
  }
}
実行結果
以下のメッセージでコンパイルエラーになりました。
FinalVariableDemo.java:4: error: cannot assign a value to final variable a
                a = 1;
                ^
1 error
解説
エラーメッセージの通り、final修飾子を付けた変数には再代入できません。
まとめ
final修飾子を用いることで、クラス・メソッド・変数の不用意な変更をブロックでき、プログラム設計者の意図を示せます。
実際に書きながら使い方を理解しましょう。
入門向けJavaの学習サイトもまとめているので、合わせてご覧ください。

クラス・メソッド・変数それぞれにfinal修飾子を付与し、継承やオーバーライド、値の再代入を行ってみた場合の例を見てみたよ。

なるほど、どれもエラーが起きていますね。

final修飾子を使うことで、意図せぬ上書きを防ぐことができるんだ。色々工夫してみよう。

了解です。ありがとうございました!
また、オンラインのプログラミングスクールTechAcademyでは、Java講座を開催しています。
JavaやServletの技術を使ってWebアプリケーションの開発を学ぶことができます。
現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、習得することが可能です。
| この記事を監修してくれた方 橋本紘希(はしもとこうき) 開発実績: Javaプログラムを用いた業務用Webアプリケーションや、基幹システム用バッチアプリケーションなどの設計構築試験。 | 
 
     
     
           
             
            