Javaで使われるfinalとは修飾子のひとつだ。変化をさせたくない変数などに利用していく。
このページではfinalの使い方についてお伝えしていこう。
目次
Javaのfinal
finalとは
Javaのfinalとは、修飾子のひとつだ。修飾子finalは、それが最後のものであることを表す。英語の意味通りだ。
例えば、円周率のような値はどこであっても変わることのない定数なので、一度代入されたなら決して変わって欲しくない。そのため、最後の値という意味でfinalを使っていく。
final変数
一度しか値を代入することができない変数をfinalを使うと宣言することができる。
例えば次の通りだ。
final float finalVariable = 3.14159f; ←1回目の代入
もしfinal変数に追加で代入しようとするとコンパイルエラーになる。
finalVariable = 3.1f; ←2回目の代入
コンパイル結果:final変数finalVariableに値を代入することはできません
これは,オブジェクトや配列を参照する変数でも同じだ。
finalクラス
クラスにfinalを付ける宣言することができる。そうすると、クラスを継承することができなくなる。
final class FinalClass { }
extendsに続く部分にfinalクラスが書いてあると、コンパイルエラーになる。
class SubclassOfFinalClass extends FinalClass { }
コンパイル結果:final FinalClassからは継承できません
finalフィールド
フィールドはクラス変数とインスタンス変数にfinalを付けて宣言することができる。
static final int finalClassVariable = 1;
final int instanceVariable = 1;
クラス変数は初期値が設定されないと,コンパイルエラーになる。
static final int finalClassVariable;
コンパイル結果:変数finalClassVariableは、デフォルト・コンストラクタで初期化されていません
もし変数の宣言時に値を設定せず、代入を分けて行いたい場合にはその直後にstaticイニシャライザ(staticブロックなどと呼ばれる場合もある)を使う方法もある。
1 2 3 4 |
static final int finalClassVariable; static { finalClassVariable = 1; } |
インスタンス変数も初期値が設定されないと,コンパイルエラーになる。
final int instanceVariable;
コンパイル結果:変数instanceVariableは、デフォルト・コンストラクタで初期化されていません
finalメソッド
メソッドにfinalを付けて宣言することができる。メソッドにfinalを付けると、サブクラスでメソッドをオーバーライドできなくなる。
1 2 3 |
class FinalMethod { final void finalMethod() { } } |
サブクラスでメソッドをオーバーライドすると,コンパイルエラーになる。
1 2 3 |
class SubclassOfFinalMethod extends FinalMethod { final void finalMethod() { } } |
コンパイル結果:SubclassOfFinalMethodのfinalMethod()はFinalMethodのfinalMethod()をオーバーライドできません
では,実際に動くコードで見てみよう。
サンプルプログラム
このサンプルは,円の面積を求めるクラスを使って円の面積を求めている。既にJavaでこの円周率は,「Math.PI」として定義されているが,finalのサンプルとしてあえて定義を独自に行っている。円周率や面積を求めるメソッドは,定理に従ったものなのでこれ以上の追加はないものとしてfinalを付けた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Circle { final double PI = 3.14159;//[1] final double calculateAreaOfCircle(double radius) {//[2] return PI * radius * radius;//[3] } } public class AreaOfCircle { public static void main(String[] args) { Circle circle = new Circle();//[10] double area = circle.calculateAreaOfCircle(2.0);//[11] System.out.println("area = " + area);//[12] } } |
実行結果
1 |
area = 12.56636 |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] final変数PIを宣言し,初期化する
- [2]-[3] 円の面積を求めるfinalメソッドcalculateAreaOfCircleを定義する。
- [10] Circleクラスのオブジェクトを作る。
- [11]-[12] 半径0の面積を求めて表示する。
まとめ
このページではJavaのfinalの使い方についてお伝えしてきた。参考にしていただければ幸いだ。
finalのフィールドですが、説明が間違っています。
変数は初期値が設定されないと,コンパイルエラーになる。
変数にfinalをつけて値を設定していない場合、
(例)
public class Test{
public static final String teststatic;
static{
teststatic = "none";
}
public final String test;
public Test(String test){
this.test = test;
}
public Test(){
test = "";
}
というように、コンストラクタやstatic{}で宣言するとコンパイルエラーは起きません。
いつもご愛読いただきありがとうございます。
記事中にstaticイニシャライザを利用した際の一例を追記いたしました。
今後とも、ご愛読のほどよろしくお願いいたします。