目次
サンプル | コンストラクタとは |
デフォルトコンストラクタとは | |
コンストラクタのオーバーロード | |
別のコンストラクタを実行する(this) | |
親クラスのコンストラクタを実行する(super) |
コンストラクタとは
class クラス名 { コンストラクタ名(引数){ 処理 } } |
・コンストラクタは、クラスをインスタンス化する時の初期値を設定するときに使用します。
・コンストラクタ名は、クラス名と同じにします。
・戻り値はないので、戻り値の記述はしません。
コンストラクタのサンプル
package test1;
class Color {
String name;
public Color(String name) {
this.name = name;
}
}
public class Test1 {
public static void main(String[] args) {
Color color1 = new Color("red");
System.out.println(color1.name); // red
// Color color2 = new Color(); // エラー
// System.out.println(color2.name);
}
}
6~8行目がコンストラクタです。
コンストラクタ名(Color)は、3行目のクラス名(Color)と同じにします。
12行目は、Colorクラスをnew演算子でインスタンス化しています。
その際に6行目が呼ばれ、7行目で引数の値が4行目のメンバ変数にセットされます。
15行目は、エラーになります。
独自のコンストラクタ(6行目)を定義すると、デフォルトコンストラクタ(引数と処理なし)がなくなるためです。→newするにはコンストラクタが必要です。
デフォルトコンストラクタとは
・独自のコンストラクタを定義していない場合は、自動で引数と処理なし(※)のデフォルトコンストラクタが生成されます。表示はされないので暗黙のコンストラクタとも呼ばれます。
※super()はあります。
・手動で作成したクラスにコンストラクタを記述しなくてもnewできるのは、デフォルトコンストラクタがあるのでインスタンス化が可能になっています。
・独自のコンストラクタを定義すると、デフォルトコンストラクタがなくなります。そのため、引数なしでnewする場合は引数なしのコンストラクタを追加する必要があります。
デフォルトコンストラクタのイメージ
package test1;
class Color {
String name;
public Color() {
super();
}
}
public class Test1 {
public static void main(String[] args) {
Color c1 = new Color();
System.out.println(c1.name); // null
}
}
6-8行目がデフォルトコンストラクタのイメージです。(通常は表示されません)
publicのコンストラクタがあるためにnewの処理ができます。
コンストラクタの前にあるpublicをprivateにした場合
コンストラクタの前にあるpublicをprivateにした場合、外部からコンストラクタを参照できずnewでインスタンス化できなくなります。
package test1;
class Color {
String name;
private Color() {
}
}
public class Test1 {
public static void main(String[] args) {
// Color c1 = new Color(); // エラー
// System.out.println(c1.name); //
}
}
コンストラクタのオーバーロード
6,9行目はコンストラクタのオーバーロードです。
package test1;
class Color {
String name;
public Color() {
this.name = "red";
}
public Color(String name) {
this.name = name;
}
}
public class Test1 {
public static void main(String[] args) {
Color c1 = new Color();
System.out.println(c1.name); // red
Color c2 = new Color("blue");
System.out.println(c2.name); // blue
}
}
6行目は、インスタンス化する時に引数がない場合に実行されます。
9行目は、インスタンス化する時にString型の引数が1つのときに実行されます。
point
コンストラクタのオーバーロードとは、コンストラクタ名が同じで引数が異なるものです。
別のコンストラクタを実行する(this)
package test1;
class Color {
String name;
public Color(String name) {
this.name = name;
}
public Color(int num) {
// System.out.println("test1");
this("red");
}
}
public class Test1 {
public static void main(String[] args) {
Color c1 = new Color(1);
System.out.println(c1.name); // red
}
}
6,9行目は、オーバーロードです。コンストラクタ名が同じで引数が異なるものです。
11行目のthisは、9行目ではなく6行目のコンストラクタを指します。String型の引数が1つで一致します。
point
別のコンストラクタを呼ぶthisは、コンストラクタ内で最初に記述します。
10行目のコメントを外すとthisが最初の記述にならないのでコンパイルエラーになります。
親クラスのコンストラクタを実行する(super)
3行目は親クラスで、10行目は子クラスです。
package test1;
class Color1 {
String name;
public Color1(String name) {
this.name = name;
}
}
class Color2 extends Color1 {
public Color2(String name) {
super(name);
}
}
public class Test1 {
public static void main(String[] args) {
Color2 c2 = new Color2("red");
System.out.println(c2.name); // red
}
}
12行目のsuperは、親クラスの6行目のコンストラクタを実行します。
point
親クラスのコンストラクタを実行する場合、superを使用します。
関連の記事