Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

定数について

有限会社ナレッジデザインのオラクル認定資格教科書『JavaプログラマSilver SE8』p.193 練習問題5-2について、解説を読みましたがよくわからなかったため質問させていただきます。

 1. public class Test{
 2.  final int a;
 3.  Test(int b){a = b;}
 4.  void method(int c){a = c;}
 5.  public static void main(String[] args){
 6.   Test t = 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行目ではコンパイルエラーとならないのでしょうか?回答よろしくお願いいたします。

2

回答

3412

閲覧

2件の回答

評価

0

ある本で分からないことは、別の本なりWebなりで調べるんだよ。
特定のものに縛られてはいけない。

今回の話は、シンプルな理解から来る混乱だ。
3行目が「コンストラクタ」であることは、理解できているのだろうか。
コンストラクタは広義にはメソッドの1つと捉えられることもあるが、その実全く意味が異なるものだ。

評価

0

finalで定義された変数は一定義につき一回しか値を入力してはならない
二行目のfinal変数は値が宣言された時点では値が入力されていない
よって一度だけ値が入力できる
このオブジェクト内のメソッドでこの変数に値を代入するようにすると
メソッド呼び出し(潜在的に複数回できる)のたびに値が入力されてしまう
なのでそのようなメソッドを作るとエラーが出る
三行目は「コンストラクタ」
このオブジェクトがnewされて新しく作られ呼び出された時その一回だけ
呼び出される
よって値が入っていないfinal変数に値を「コンストラクタ」内にて「一回」だけ
入力してやる事は可能でエラーは出ない

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。