質問: new Test(10); 7. t.method(20); 8. System.out.println(t.a); 9. } 10. } 上記のコードで2行目の変数aがfinalで修飾されているため定数になっていることはわかりました。 そして3行目で変数bを定数aに代入しようとしているためコンパイルエラーとなると判断しました。 しかし、解説では「このコードでは宣言時に初期化していませんが、コンストラクタを使用して初期化しているため問題ありません。4行目のmethod()によって値の変更を行おうとしているため、4行目でコンパイルエラーとなります」となっていました。なぜ、3行目ではコンパイルエラーとならないのでしょうか?回答よろしくお願いいたします。
回答: finalで定義された変数は一定義につき一回しか値を入力してはならない 二行目のfinal変数は値が宣言された時点では値が入力されていない よって一度だけ値が入力できる このオブジェクト内のメソッドでこの変数に値を代入するようにすると メソッド呼び出し(潜在的に複数回できる)のたびに値が入力されてしまう なのでそのようなメソッドを作るとエラーが出る 三行目は「コンストラクタ」 このオブジェクトがnewされて新しく作られ呼び出された時その一回だけ 呼び出される よって値が入っていないfinal変数に値を「コンストラクタ」内にて「一回」だけ 入力してやる事は可能でエラーは出ない