Javaのfinal修飾子について記載します。
目次
final修飾子
1. 適用箇所
クラス、メソッド、変数に使用することができます。
final修飾子を適用することにより、以下の制限をかけることができます。
クラス | サブクラスが作成出来なくなる。(継承不可) |
---|---|
メソッド | サブクラスでメソッドをオーバーライドが不可になる。 |
変数 | 定数となり、再代入不可になる。 |
2. 構文
クラス、メソッド、変数ともに、アクセス修飾子(privateやpublicなど)の次に指定します。
ただし、アクセス修飾子は省略可能なので、final修飾子を宣言の先頭にすることもできます。
finalクラス
1 2 3 4 5 |
// finalクラスの定義 final class ClassA {} // fainalクラスを継承することは出来ない(コンパイルエラー) final class ClassSubA extends ClassA {} |
finalメソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// finalメソッドの定義 class ClassB { final void printMessage(){ System.out.println("final method"); } } // finalメソッドを継承先でオーバーライドすることは出来ない(コンパイルエラー) class ClassSubB extends ClassB { void printMessage(){ System.out.println("method"); } } |
final 変数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class ClassC{ // クラス変数として定義 final String strA = "A"; void printMessage(){ // ローカル変数として定義 final String strB = "B"; // 再代入は出来ない(コンパイルエラー) strB = "BB"; System.out.println(strB); } } |
3. 定数(final な 変数)について
定数の初期化タイミングは、3つあります。
・宣言時
・コンストラクタ
・イニシャライザ
初期化の例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class ClassD{ // 宣言時に初期化 final String strA = "A"; // 宣言時には初期化せずコンストラクタで初期化 final String strB; public ClassD( String src ){ strB = src; } // 宣言時には初期化せずイニシャライザで初期化 final static String strC; static{ strC = "C"; } } |