※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

4. 型と値と変数

4.1. 型と変数の種類

4.2. プリミティブ型と値

4.3. 参照型と値

4.4. 型変数

4.5. 引数付き型

4.6. 型の抹消

4.7. 具象可能型

4.8. 未加工型

4.9. 交差型

4.10. サブタイプ化

4.11. 型の使用箇所

4.12. 変数

4.12.1. プリミティブ型の変数

4.12.2. 参照型の変数

4.12.3. 変数の種類

4.12.4. final変数

変数はfinalと宣言できます。final変数は一度しか代入できません。final変数の宣言はその値に変更はないということを明示しプログラミングエラーを避けやすくする有益なドキュメントとなることができます。

代入以前に確実に代入されていない場合を除いて、final変数が代入される時にはコンパイルエラーが出力されます。

空(blank)finalとは初期化子が宣言にないfinal変数です。

一度final変数が代入されると、それは常に同じ値を保持します。もしfinal変数がオブジェクトへの参照を保持するなら、そのオブジェクトへの演算によりそのオブジェクトのステートが変化しても構いませんが、変数は常にその同じオブジェクトを参照します。

配列はオブジェクトなので、これは配列にも当てはまります。もしfinal変数が配列への参照を保持するなら、その配列への演算によってその配列の要素は変化しても構いませんが、変数は常にその同じ配列を参照します。

例4.12.4-1. final変数

class Point {
    int x, y;
    int useCount;
    Point(int x, int y) { this.x = x; this.y = y; }
    static final Point origin = new Point(0, 0);
}

このプログラムで、クラスPointは最初にfinalクラス変数originと宣言されています。origin変数は座標が(0,0)であるPointクラスのインスタンスであるオブジェクトへの参照を保持しています。変数Point.originの値は絶対に変わらず、初期化子で作成された同じPointオブジェクトを常に参照しています。しかし、このPointオブジェクトに対する演算でそのステートが変更できます。例えば、useCountやさらに、紛らわしいことに、xy座標も変更できます。

プリミティブ型やString型の変数はfinalでコンパイル時の定数式によって初期化されます。これを定数変数(constant variable)と呼びます。

変数が定数変数かどうかはクラス初期化、バイナリ―互換性(13.1.13.4.9.)そして確実な代入に関しては違いを生みます。

リソース付きtry文のリソースや複数catch節の例外引数は暗黙的にfinalと宣言されます。

単一catch節の例外引数は明示的にfinalと宣言される代わりに事実上final(effectively final)です。そのような引数は暗黙的にfinalとは宣言されません。

4.12.5. 変数の初期値

4.12.6. 型とクラスとインタフェース