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アプリケーションや、基幹システム用バッチアプリケーションなどの設計構築試験。 |