インスタンス化についてまとめましたがそれと付随するコンストラクタというものについて今回はまとめます。
インスタンス化については→こちら
コンストラクタとは
インスタンス化をする際に自動でフィールドを初期化する特殊なメソッドを定義できる。
インスタンス化されると同時に自動で動く特殊なメソッドです。
フィールドに実体を定義するうえで必要な初期値を代入する役割を担います。
コンストラクタはメソッドの一種で様々な引数のパターンに応じてオーバーロードして定義することが可能となるものです。
ルール
- コンストラクタの定義において戻り値は記述しない。
- コンストラクタ名はクラス名と同じ。
- コンストラクタは絶対に実行されなければいけない。
- インスタンス生成時、必ず最初に呼び出される。※引数に合わせて呼び出されるコンストラクタは変わる。
- 明示的にコンストラクタをクラスで定義していない場合はインスタンス化の際に引数無しのコンストラクタが暗黙的に自動で生成されている。これをデフォルトコンストラクタと言う。
- 引数ありのコンストラクタなど、すでに明示的にコンストラクタを定義している場合はデフォルトコンストラクタは生成されない。
構文
- クラス名 インスタンス名 = new クラス名(引数); //インスタンス化
- クラス名(){} //引数無しのコンストラクタ or デフォルトコンストラクタ
- クラス名(引数){} //引数ありのコンストラクタ
ここの右辺のクラス名はクラスのそのものをオブジェクト化するために呼び出しているのではなく、対象クラスのコンストラクタを呼び出しているのですね。
クラス名とコンストラクタ名が一緒なので今までクラスを呼び出していると勘違いしていました。
デフォルトコンストラクタとは
ルールでも少し記載しましたがJavaにはデフォルトコンストラクタという機能もあります。
コンストラクタはインスタンス化の際には必ず実行されます。
研修などで意識していなかったのですが(そもそもインスタンス化を勘違いしていた)コンストラクタは記載がなくてもインスタンス化の際には常に、そして絶対に作られ、実行されています。
明示的に定義されていない場合、、Javaが裏側で引数なし&処理なしのコンストラクタを定義してデフォルトコンストラクタを実行させています。それをデフォルトコンストラクタと呼びます。
重複しますがデフォルトコンストラクタは既に引数の有無にかかわらず定義されていた場合には作成されません。
ひっかけ問題で出てきますので注意ですね。
thisについて
また、①this()とすることで自分のクラスのコンストラクタを指すことができる。
②this.変数名で自分のクラスのフィールドを指すことができる。
①の使いどころはコンストラクタからコンストラクタを呼びだす時ですね。()内に引数を指定してそれに対応するコンストラクタを呼び出します。※必ずコンストラクタの先頭行に記述する事。
呼び出したコンストラクタが先に処理されて、そのあとに元のコンストラクタが動きます。後に処理された内容は当然のことながら先のコンストラクタの処理内容を反映したうえで処理が進むということですね。
②の使い道に関しては引数名(ローカル変数)とクラスで定義された変数を区別するために使用します。引数の変数名とそのクラスで宣言された変数名が同じだった場合スコープの関係でどの変数に代入しているかなどがわからなくなりますし、本当はそのコンストラクタに引数を渡してそのクラスのフィールドに値を入れたいのにコンストラクタ内のローカル変数にしか代入されないことになります。
そうならないために、this.変数名 = ローカル変数・引数名 とすれば引数で受け取った値をthisでそのクラスで宣言された変数のフィールドに代入することができる。
という仕組みになっています。
コメント