コンストラクタとは
インスタンス化と同時に、
生成されるオブジェクトに対して
行っておきたい処理を記述します。
この処理はインスタンス化された直後に
実行される処理になります。
コンストラクタと見なされる条件
- メソッド名がクラスメイト完全に同じである
- メソッド宣言に戻り値の記述なし(voidも✕)
コンストラクタを使用した場合と
使用しない場合で解説します。
1 2 3 4 5 6 7 8 9 10 |
public class CarA { //ドアの数 int doorNum; //車名 String name; void run() { } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class Sample3 { public static void main(String[] args) { CarA c1 = new CarA(); c1.doorNum = 4; c1.name = "スポーツカー"; CarA c2 = new CarA(); c2.doorNum = 4; c2.name = "乗用車"; CarA c3 = new CarA(); c3.doorNum = 4; c3.name = "軽自動車"; System.out.println(c1.doorNum+"つドアがある"+c1.name); System.out.println(c2.doorNum+"つドアがある"+c2.name); System.out.println(c3.doorNum+"つドアがある"+c3.name); } } |
1 2 3 |
4つドアがあるスポーツカー 4つドアがある乗用車 4つドアがある軽自動車 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class CarA { // ドアの数 int doorNum; // 車名 String name; void run() { } // コンストラクタ CarA() { // CarAがnewされた直後に自動的に実行される処理 this.doorNum = 4; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Sample3 { public static void main(String[] args) { CarA c1 = new CarA(); c1.name = "スポーツカー"; CarA c2 = new CarA(); c2.name = "乗用車"; CarA c3 = new CarA(); c3.name = "軽自動車"; System.out.println(c1.doorNum+"つドアがある"+c1.name); System.out.println(c2.doorNum+"つドアがある"+c2.name); System.out.println(c3.doorNum+"つドアがある"+c3.name); } } |
1 2 3 |
4つドアがあるスポーツカー 4つドアがある乗用車 4つドアがある軽自動車 |
newされると自動的に実行されて
doorNumに4が代入されています。
その為、mainメソッドで
初期値を代入する必要がなくなります。
固定値で初期化をしたい場合
(ここでは車のドアの数)は、
単純なコンストラクタで可能でした。
しかし車種名の場合は
生成するインスタンスによって異なります。
このような場合は、コンストラクタが
引数で受けてれるように宣言します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class CarA { // ドアの数 int doorNum; // 車名 String name; void run() { } // コンストラクタ CarA(String name) { // CarAがNewされた直後に自動的に実行される処理 this.doorNum = 4; this.name = name; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Sample3 { public static void main(String[] args) { CarA c1 = new CarA("スポーツカー"); CarA c2 = new CarA("乗用車"); CarA c3 = new CarA("軽自動車"); System.out.println(c1.doorNum+"つドアがある"+c1.name); System.out.println(c2.doorNum+"つドアがある"+c2.name); System.out.println(c3.doorNum+"つドアがある"+c3.name); } } |
1 2 3 |
4つドアがあるスポーツカー 4つドアがある乗用車 4つドアがある軽自動車 |
コンスタラクタに渡すべき引数を
newする際に指定することで、
newした時点で与えらた引数が
コンストラクタが自動実行される際に
パラメータとして渡されます。
「引数を受け取るコンストラクタ」と
「引数を受け取らないコンストラクタ」を
同時に定義することで
複数のコンストラクタを
使い分けることが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class CarA { // ドアの数 int doorNum; // 車名 String name; void run() { } // コンストラクタ1 文字列引数がある CarA(String name) { // CarAがNewされた直後に自動的に実行される処理 this.doorNum = 4; this.name = name; } // コンストラクタ2 文字列引数がない場合 CarA() { // CarAがNewされた直後に自動的に実行される処理 this.doorNum = 4; this.name = ""; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Sample3 { public static void main(String[] args) { // コンストラクタ1が呼び出される CarA c1 = new CarA("スポーツカー"); // コンストラクタ2が呼び出される CarA c2 = new CarA(); // コンストラクタ1が呼び出される CarA c3 = new CarA("軽自動車"); System.out.println(c1.doorNum + "つドアがある" + c1.name); System.out.println(c2.doorNum + "つドアがある" + c2.name); System.out.println(c3.doorNum + "つドアがある" + c3.name); } } |
1 2 3 |
4つドアがあるスポーツカー 4つドアがある 4つドアがある軽自動車 |
コンストラクタをオーバーロードすることで
複数のコンストラクタを定義できます。
複数コンストラクタが定義されていた場合は、
対応するコンストラクタが動作します。
複数のコンストラクタが定義されていても、
1つだけしか動作しません。
すべてのクラスはインスタンス化する際
必ず何らかのコンストラクタを
実行する決まりになっています。
コンストラクタの特例
定義されていない場合に限って
「引数なし、処理内容なし」の
コンストラクタ定義が
コンパイル時に自動的に追加される。
このコンストラクタの特例によって、
通常のインスタンス生成が可能になります。
重複する内容がある場合は、
初期値を変更する際に
必要がでてきます。
また本格的なプログラムになると
重複部分が多くなることが一般的ですので、
そうなると修正が大変になってしまい、
ミスにもつながります。
Javaではコンストラクタを
直接呼び出すことができないので、
別のコンストラクタの呼び出しルール
- this.クラス名(引数); ✕
- this(引数); ○
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class CarA { // ドアの数 int doorNum; // 車名 String name; void run() { } // コンストラクタ1 文字列引数がある CarA(String name) { // CarAがNewされた直後に自動的に実行される処理 this.doorNum = 4; this.name = name; } // コンストラクタ2 文字列引数がない場合 CarA() { // コンストラクタ1を呼び出す this(""); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Sample3 { public static void main(String[] args) { // コンストラクタ1が呼び出される CarA c1 = new CarA("スポーツカー"); // コンストラクタ2が呼び出される CarA c2 = new CarA(); // コンストラクタ1が呼び出される CarA c3 = new CarA("軽自動車"); System.out.println(c1.doorNum + "つドアがある" + c1.name); System.out.println(c2.doorNum + "つドアがある" + c2.name); System.out.println(c3.doorNum + "つドアがある" + c3.name); } } |
1 2 3 |
4つドアがあるスポーツカー 4つドアがある 4つドアがある軽自動車 |
「this.メンバ名」のthisは
自身のインスタンスを表す。
「this(引数)」のthis()は
同一クラスの別のコンストラクタを呼び出す。
この記事へのコメントはありません。