コンストラクタを理解する

コンストラクタはnewで作る実体の初期状態を設定します。クラス名と同じ名前で戻り値型を書かない宣言、暗黙のデフォルトコンストラクタ、引数による選択、thisによる連鎖を学びます。

この単元で学ぶこと

  • コンストラクタと通常メソッドを区別する
  • デフォルトコンストラクタの有無を判定する
  • 引数と初期化順から生成後の状態を求める

本文解説

宣言の形 class Box { int n; Box(){n=3;} }のBox()がコンストラクタです。クラス名と完全に一致し、voidを含む戻り値型を書きません。new Box()の際に実行され、生成した実体のnを3にします。

通常メソッドとの違い void Box(){n=3;}は名前が同じでも戻り値型voidを持つ通常メソッドです。new Box()で自動実行されず、明示的にb.Box()と呼んだ場合に実行します。宣言名だけでなく戻り値型の有無を見ます。

引数で初期値を渡す Box(int value){n=value;}ならnew Box(7)で7を初期状態へ使えます。呼出し時に引数の型と個数が一致するコンストラクタを探します。int引数へ文字列"7"を渡しても数値に自動解析しません。

デフォルトが作られる条件 コンストラクタを一つも宣言しなければ、引数なしのデフォルトコンストラクタが与えられます。Box(int n)を一つでも宣言すれば自動のBox()はありません。引数なしでも作りたいならBox()を明示的に追加します。

オーバーロード Box(){n=1;}とBox(int x){n=x;}を同じクラスへ定義できます。new Box()は前者、new Box(5)は後者を選びます。同じ引数型の宣言を二つ置くことはできず、仮引数名だけを変えても別のシグネチャにはなりません。

フィールド初期化との順序 int n=2;Box(){n+=3;}なら生成後nは5です。フィールド初期化を終えてからコンストラクタ本体を実行します。コンストラクタでn=3と上書きする場合は初期化子2が最後まで残るわけではありません。

実体ごとの初期化 Box a=new Box(2),b=new Box(5);なら各実体へ異なる値を設定できます。コンストラクタはnewごとに実行されます。参照をコピーしてBox b=aとしただけでは新しい実体もコンストラクタ実行も増えません。

コンストラクタを呼ぶ場所 new Box()は生成式、this(...)は同じクラスの別コンストラクタへの特別な呼出しです。b.Box()ではコンストラクタを再実行できません。this(...)の前に通常文を置けるか等は言語版の規則に依存するため、ここではJava 11の先頭文制約に従います。

図解

生成時の初期化の順
継承時の親初期化の詳細は継承単元で扱う。

重要ポイント

  • コンストラクタ名はクラス名と同じで戻り値型を書かない。
  • 一つも宣言しない場合にだけデフォルトコンストラクタが与えられる。
  • 引数の数や型が違うコンストラクタをオーバーロードできる。
  • Java 11のthis(...)はコンストラクタ本体の先頭文に置く。

間違えやすい点

  • voidを付けた同名メソッドをコンストラクタと思わない。
  • 引数付きだけ宣言してもnew C()が使えると考えない。
  • コンストラクタを通常のメソッド呼出しで再実行しようとしない。

用語解説

コンストラクタ
実体生成時に初期状態を設定する特別な宣言。
デフォルトコンストラクタ
明示宣言がないクラスにコンパイラが与えるコンストラクタ。
コンストラクタ連鎖
this(...)やsuper(...)で別のコンストラクタへ処理を委譲すること。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。