Java コンストラクタのサンプル

Javaのコンストラクタのサンプルです。

目次

サンプル コンストラクタとは
  コンストラクタのサンプル
  デフォルトコンストラクタ
  コンストラクタのオーバーロード
  別のコンストラクタを実行する(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("赤");
		System.out.println(color1.name); // 赤
		
//		Color color2 = new Color(); // エラー
//		System.out.println(color2.name);
	}
}

6~8行目がコンストラクタです。
コンストラクタ名(Color)は、3行目のクラス名(Color)と同じにします。
12行目は、Colorクラスをnew演算子でインスタンス化しています。
その際に6行目が呼ばれ、7行目で引数の値が4行目のメンバ変数にセットされます。

15行目は、エラーになります。
独自のコンストラクタ(6行目)を定義すると自動で生成される引数がないコンストラクタがなくなるためです。→newするにはコンストラクタが必要です。

 

デフォルトコンストラクタ

  • 独自のコンストラクタを記述しない場合、引数がない空のコンストラクタが生成されていることになります。
    そのコンストラクタのことをデフォルトコンストラクタまたは暗黙のコンストラクタと呼びます。
  • デフォルトコンストラクタがあるのでnewで引数なしのインスタンス化が可能になっています。
  • 独自のコンストラクタを記述した場合は、デフォルトコンストラクタは生成されません。
    →そのままの状態では引数なしで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にした場合、外部からコンストラクタを参照できず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); //
	}
}

 

コンストラクタのオーバーロード

コンストラクタのオーバーロードとは、コンストラクタ名が同じで引数が異なるものです。

package test1;

class Color {
	String name;

	public Color() {
		this.name = "赤";
	}
	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); // 赤
		Color c2 = new Color("青");
		System.out.println(c2.name); // 青
	}
}

6,9行目がオーバーロードです。

6行目は、インスタンス化する時に引数がない場合に実行されます。
9行目は、インスタンス化する時にString型の引数が1つのときに実行されます。

 

別のコンストラクタを実行する(this)

別のコンストラクタを実行する場合、thisを使用します。

package test1;

class Color {
	String name;

	public Color(String name) {
		this.name = name;
	}
	public Color(int num) {
		// System.out.println("test1");
		this("赤");
	}
}
public class Test1 {
	public static void main(String[] args) {
		Color c1 = new Color(1);
		System.out.println(c1.name); // 赤
	}
}

6,9行目は、オーバーロードです。コンストラクタ名が同じで引数が異なるものです。

11行目のthisは、6行目のコンストラクタを指します。String型の引数が1つで一致するので6行目のコンストラクタが実行されます。

別のコンストラクタを呼ぶthisは、コンストラクタ内で最初に記述します。
10行目のコメントを外すとthisが最初の記述にならないのでコンパイルエラーになります。

 

親クラスのコンストラクタを実行する(super)

親クラスのコンストラクタを実行する場合、superを使用します。

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("赤");
		System.out.println(c2.name); // 赤
	}
}

12行目のsuperは、親クラスの6行目のコンストラクタを実行します。

関連の記事

Java入門 クラスの仕組みとサンプル
Java オーバーロードのサンプル

△上に戻る