Javaではfinal修飾子を使用して、値を後から変更できないようにすることが可能です。
この記事では、final修飾子の基礎から発展まで以下の内容で解説していきます。
【基礎】final修飾子とは
【基礎】final修飾子の使い方一覧
【基礎】finalでクラスの継承を防ぐ
【基礎】finalでメソッドのオーバーライドを防ぐ
【発展】static finalで定数を定義する
【発展】finalで引数の値の変更を防ぐ
今回はそんなfinal修飾子の使い方について、わかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
finalとは
一度変数に設定した値を、後から変更されないようにするためにはfinal修飾子を使用します。
final修飾子は、主に値を変更する予定が無い定数(既定値やファイルパス)などの値を設定するときに使用します。
例えば、変数に対して以下のようにfinal修飾子を指定すれば、その変数は値の変更ができなくなります。
final 型 変数名 = 値
final修飾子は変数以外にもクラスやメソッドも、内容を変更されたくないときに使用することもできます。
クラスをfinal指定するには、以下のように記述します。
final class クラス名 { // 処理 }
final修飾子の使い方一覧
final修飾子はクラス、メソッド、変数、引数に指定することができて、それぞれで意味が変わってきます。
表にまとめてみました。
修飾先 | 説明 |
---|---|
クラス | 継承不可 |
メソッド | オーバーライド不可 |
変数 | 定数となり変更不可 |
引数 | メソッド内で変更不可 |
それぞれについて詳しくみていきましょう。
finalでクラスの継承を防ぐ
final修飾子を指定してクラスを宣言すると、その親クラスは子クラスで継承することはできません。
親クラスをfinal指定する目的としては、その親クラスの「安全性保つ」ために使用します。
例えば、以下のようにfinal指定した親クラスに対して、extendsで継承するとコンパイルエラーとなります。
final class 親クラス名 { // 処理 } class 子クラス名 extends 親クラス名 { // 処理 }
finalでメソッドのオーバーライドを防ぐ
final修飾子は、メソッドに指定することも可能です。
親クラスのメソッドの内容を、サブクラスで変更されたくないときにメソッドにfinal修飾子を指定します。
以下のように親クラスのメソッドにfinalを指定すると、子クラスでメソッドのオーバーライドができなくなります。
class 親クラス名 { final void メソッド名() { // 処理 } } class 子クラス名 extends 親クラス名 { void 親クラスのメソッド名() { // 処理 } }
static finalで定数を定義する
static修飾子は、静的な変数、メンバの意味で、static修飾子を付与したメンバはクラスをインスタンス化しなくても、「クラス名.静的メンバ」の記述で参照することが可能です。
staticイニシャライザで初期化
static修飾子を付与したfinalな変数は、以下のようにstaticイニシャライザ内で定数をまとめて初期化することが可能です。
public static final int 変数1; public static final int 変数2; public static final int 変数3; static { 変数1 = 10; 変数2 = 20; 変数3 = 30; }
そんなstatic finalの使い方については、以下の記事で詳しく解説しています!
初期化時の注意点
先ほどは初期化についてお伝えしました。
もし、初期値を設定しなければコンパイルエラーとなりますので、ご注意ください。
finalで引数の値の変更を防ぐ
final修飾子は、メソッドの引数に指定することも可能です。
finalを引数に付加することにより、その変数はメソッド内で値を変更することができなくなります。
例えば以下のようにfinal修飾子を指定した引数に、値を設定しようとすると、エラーが発生します。
private static void メソッド名(final String str) { //finalが付与されているため変更不可 str = "Samurai"; }
ここで紹介したfinalな引数を渡す方法や、メソッド内で引数を渡すさまざまな方法については、以下の記事でも詳しく解説しています。
まとめ
ここではfinalの意味や基本的な使い方、static finalの使い方やメソッドの引数にfinalを指定する方法などについて紹介しました。
変数の値やクラス、メソッドの内容を変更されたくないときにfinal修飾子はよく使われますので、ぜひ覚えておきましょう!
final修飾子の使い方を忘れてしまったら、この記事を思い出してくださいね。