Javaプログラムにおけるfinal修飾子とは【初心者向け】

初心者向けにJavaプログラムにおけるfinal修飾子の使い方について詳しく解説しています。クラス、メソッド、変数にfinal修飾子を付与する書き方を説明しています。実際にサンプルプログラムも書いているので、ぜひ参考にしてみてください。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,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修飾子を付けた変数には再代入できません。

 

[PR] Javaで挫折しない学習方法を動画で公開中

まとめ

final修飾子を用いることで、クラス・メソッド・変数の不用意な変更をブロックでき、プログラム設計者の意図を示せます。

実際に書きながら使い方を理解しましょう。

入門向けJavaの学習サイトもまとめているので、合わせてご覧ください。

 

田島悠介

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

大石ゆかり

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

田島悠介

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

大石ゆかり

了解です。ありがとうございました!

また、オンラインのプログラミングスクールTechAcademyでは、Java講座を開催しています。

JavaやServletの技術を使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

この記事を監修してくれた方

橋本紘希(はしもとこうき)
システムインテグレータ企業勤務のシステムエンジニア

開発実績: Javaプログラムを用いた業務用Webアプリケーションや、基幹システム用バッチアプリケーションなどの設計構築試験。