「4.12.4. final変数」の編集履歴(バックアップ)一覧はこちら
「4.12.4. final変数」(2012/09/11 (火) 14:36:54) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*[[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変数
変数は&tt(){final}と宣言できます。&tt(){final}変数は一度しか代入できません。&tt(){final}変数の宣言はその値は変更ないということを明示しプログラミングエラーを避けやすくする有益なドキュメントなることができます。
&bold(){代入以前に[[確実に代入されていない>16. 確実な代入]]場合を除いて、&tt(){final}変数が代入される時にコンパイルエラーが出力されます。}
&i(){空(blank)&tt(){final}}とは初期化子が宣言にない&tt(){final}変数です。
一度&tt(){final}変数が代入されると、それは常に同じ値を保持します。もし&tt(){final}変数がオブジェクトへの参照を保持するなら、そのオブジェクトへの演算によりそのオブジェクトのステートが変化しても構いませんが、変数は常にその同じオブジェクトを参照します。
配列はオブジェクトなので、これは配列にも当てはまります。もし&tt(){final}変数が配列への参照を保持するなら、その配列への演算によってその配列の要素は変化しても構いませんが、変数は常にその同じ配列を参照します。
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{
&bold(){&aname(ex4.12.4-1,option=nolink){例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);
}
&i(){&small(){このプログラムで、クラス&tt(){Point}は最初に&tt(){final}クラス変数&tt(){origin}と宣言されています。&tt(){origin}変数は座標が&tt(){(0,0)}である&tt(){Point}クラスのインスタンスであるオブジェクトへの参照を保持しています。変数&tt(){Point.origin}の値は絶対に変わらず、初期化子で作成された同じ&tt(){Point}オブジェクトを常に参照しています。しかし、この&tt{Point}オブジェクトに対する演算でそのステートが変更できます。例えば、&tt(){useCount}やさらに、紛らわしいことに、&tt(){x}や&tt(){y}座標も変更できます。}}
}}}
プリミティブ型や&tt(){String}型の変数は&tt(){final}でコンパイル時の[[定数式>15.28. 定数式]]によって初期化されます。これを&i(){定数変数(constant variable)}と呼びます。
変数が定数変数かどうかは[[クラス初期化>12.4.1. 初期化の実行時点]]、バイナリ―互換性([[13.1.>13.1. バイナリ―の形式]]、[[13.4.9.>13.4.9. finalフィールドと定数]])そして[[確実な代入>16. 確実な代入]]に関しては意味があります。
[[リソース付きtry文>14.20.3. リソース付きtry]]のリソースや複数[[catch節>14.20. try文]]の例外引数は暗黙的に&tt(){final}と宣言されます。
単一[[catch節>14.20. try文]]の例外引数は明示的に&tt(){final}と宣言される代わりに&i(){事実上&tt(){final}(effectively final)}です。そのような引数は暗黙的に&tt(){final}とは宣言されません。
***[[4.12.5. 変数の初期値]]
***[[4.12.6. 型とクラスとインタフェース]]
*[[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変数
変数は&tt(){final}と宣言できます。&tt(){final}変数は一度しか代入できません。&tt(){final}変数の宣言はその値に変更はないということを明示しプログラミングエラーを避けやすくする有益なドキュメントとなることができます。
&bold(){代入以前に[[確実に代入されていない>16. 確実な代入]]場合を除いて、&tt(){final}変数が代入される時にはコンパイルエラーが出力されます。}
&i(){空(blank)&tt(){final}}とは初期化子が宣言にない&tt(){final}変数です。
一度&tt(){final}変数が代入されると、それは常に同じ値を保持します。もし&tt(){final}変数がオブジェクトへの参照を保持するなら、そのオブジェクトへの演算によりそのオブジェクトのステートが変化しても構いませんが、変数は常にその同じオブジェクトを参照します。
配列はオブジェクトなので、これは配列にも当てはまります。もし&tt(){final}変数が配列への参照を保持するなら、その配列への演算によってその配列の要素は変化しても構いませんが、変数は常にその同じ配列を参照します。
#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{
&bold(){&aname(ex4.12.4-1,option=nolink){例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);
}
&i(){&small(){このプログラムで、クラス&tt(){Point}は最初に&tt(){final}クラス変数&tt(){origin}と宣言されています。&tt(){origin}変数は座標が&tt(){(0,0)}である&tt(){Point}クラスのインスタンスであるオブジェクトへの参照を保持しています。変数&tt(){Point.origin}の値は絶対に変わらず、初期化子で作成された同じ&tt(){Point}オブジェクトを常に参照しています。しかし、この&tt(){Point}オブジェクトに対する演算でそのステートが変更できます。例えば、&tt(){useCount}やさらに、紛らわしいことに、&tt(){x}や&tt(){y}座標も変更できます。}}
}}}
プリミティブ型や&tt(){String}型の変数は&tt(){final}でコンパイル時の[[定数式>15.28. 定数式]]によって初期化されます。これを&i(){定数変数(constant variable)}と呼びます。
変数が定数変数かどうかは[[クラス初期化>12.4.1. 初期化の実行時点]]、バイナリ―互換性([[13.1.>13.1. バイナリ―の形式]]、[[13.4.9.>13.4.9. finalフィールドと定数]])そして[[確実な代入>16. 確実な代入]]に関しては違いを生みます。
[[リソース付きtry文>14.20.3. リソース付きtry]]のリソースや複数[[catch節>14.20. try文]]の例外引数は暗黙的に&tt(){final}と宣言されます。
単一[[catch節>14.20. try文]]の例外引数は明示的に&tt(){final}と宣言される代わりに&i(){事実上&tt(){final}(effectively final)}です。そのような引数は暗黙的に&tt(){final}とは宣言されません。
***[[4.12.5. 変数の初期値]]
***[[4.12.6. 型とクラスとインタフェース]]
表示オプション
横に並べて表示:
変化行の前後のみ表示: