【Java】コンストラクタとは?現役エンジニアがわかりやすく解説!

Java

今回の記事ではJavaのコンストラクタについて現役エンジニアがわかりやすく解説していきます。

  • コンストラクタとは?
  • コンストラクタのthisって?
  • コンストラクタのオーバーロード

ということについて徹底的に解説していきます。
この記事を読むことで、コンストラクタについて理解することができます。
ぜひ最後まで読んでいってくださいね!
「このまま勉強を続けてプログラミングを習得できるか不安」という方におすすめなのがTech Academyの無料メンター相談です。
現役エンジニア講師とマンツーマンで無料相談できます!公式サイトから予約して、独学の不安を解消しましょう!

コンストラクタとは?

コンストラクタとはクラスをインスタンス化する際に1度だけ実行される処理のことです。
クラスが持っているフィールドに値を設定するときなどに使われることが多いです。

インスタンス化についてはコチラの記事も参考にしてみてください。

コンストラクタはちょっと変わったメソッド

コンストラクタのイメージは「ちょっと変わったメソッド」です。
じゃあ普通のメソッドとは何が違うんだ?というと次のような違いがあります。

  • クラス名と同じ名前
  • 戻り値がない
  • インスタンスが作られるときに実行される

このような違いがあることを頭に入れておきましょう。

コストラクタの基本的な書き方

では次にコンストラクタの基本的な書き方について解説します。
基本的には次のように書きます。

アクセス修飾子 クラス名(引数) {
        処理...
}

メソッドの書き方と似ていることがわかります。
ただしコンストラクタは戻り値がないので、戻り値の型を宣言する必要はありません。

アクセス修飾子には普通のメソッドと同じように次の4つのどれかを指定することができます。

  • public:どこからでも呼び出し可能
  • protected:同じパッケージ、継承したクラスから呼び出し可能
  • デフォルト(指定なし):同じパッケージから呼び出し可能
  • private:同じクラス内からのみ呼び出し可能

アクセス修飾子については次の記事も参考にしてください。

サンプルコードでコンストラクタを確認

「コンストラクタとはなんなのか?」
「コンストラクタの基本的な書き方」
がわかったところで、実際のコードで確認してみましょう。

次のプログラムを確認してください。

/**
 * 女優クラス
 * @author uhablog
 */
class Actress {

	public String name;

	public int age;

	/**
	 * Actressクラスのコンストラクタ
	 */
	public Actress() {
		System.out.println("Actressクラスのコンストラクタだよ");
	}
}


public class Constractor {

	public static void main(String[] args) {
		// Actressクラスをインスタンス化するとコンストラクタが実行される
		Actress yuiAragaki = new Actress();
	}

}

女優を表すActressクラスを作成しました。
Actressクラスのコンストラクタではprintlnメソッドを使ってコンソールに出力する処理を記述しました。
mainメソッド内でActressクラスをインスタンス化する処理を記述して、実行してみます。
すると実行結果は次の通りです。

Actressクラスのコンストラクタだよ

これで、クラスをインスタンス化する際にコンストラクタが実行されることが確認できました。

thisを使ってフィールドに値を設定する

コンストラクタはクラスのフィールドに値を設定することによく使われます。
実際のプログラムを確認してください。

class Actress {

	public String name;

	public int age;

	/**
	 * Actressクラスのコンストラクタ
	 */
	public Actress(String name, int age) {
		this.name = name;
		this.age = age;
	}
}

public class Constractor {

	public static void main(String[] args) {
		// 女優クラスをインスタンス化し、フィールドに設定する値を引数で渡す
		Actress yuiAragaki = new Actress("新垣結衣", 33);

		// 出力でフィールドに値が設定されていることを確認する
		System.out.println(yuiAragaki.name + "の年齢は" + yuiAragaki.age + "才です");
	}

}

コンストラクタの引数を増やして、名前と年齢を受け取るようにしました。
受け取った値をActressクラスのフィールドに値を設定しています。

実行すると次のようになります。

新垣結衣の年齢は33才です

thisってなに?

コンストラクタにフォーカスしてみましょう。
コンストラクタは次のようになっています。

/**
 * Actressクラスのコンストラクタ
 */
public Actress(String name, int age) {
	this.name = name;
	this.age = age;
}

コンストラクタ内で「this.name」や「this.age」と記述している箇所があります。
これらはActressクラスのフィールドであるnameとageを表しています。

そして「this.name」や「this.age」に値を代入しているただのnameやageと記述されているものが、コンストラクタの引数として受け取った値を表しています。

このthisはコンストラクタでよく利用されるので、使えるようにしておきましょう!

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

次はコンストラクタのオーバーロードについて解説します。
オーバーロードは引数の型・数・並び順を入れ替えることで、同じメソッドを複数定義できることです。
コンストラクタでも引数を変えることで、複数定義することができます。

オーバーロードについてはコチラの記事でも詳しく解説しています。

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

では実際にコンストラクタのオーバーロードのサンプルを確認してみましょう。

/**
 * 女優クラス
 * @author uhablog
 */
class Actress {

	public String name;

	public int age;

	public Actress() {
		System.out.println("引数なしのコンストラクタが呼び出されました!");
	}

	public Actress(String name) {
		System.out.println("引数がStringのみのコンストラクタが呼び出されました!名前を設定します");
		this.name = name;
	}

	public Actress(int age) {
		System.out.println("引数がintのみのコンストラクタが呼び出されました!年齢を設定します");
		this.age = age;
	}

	public Actress(String name, int age) {
		System.out.println("引数がStringとintのコンストラクタが呼び出されました!名前と年齢を設定します");
		this.name = name;
		this.age = age;
	}
}

public class Constractor {

	public static void main(String[] args) {

		// 引数なしのコンストラクタを呼び出す
		Actress yuiAragaki = new Actress();

		// 引数がStringのコンストラクタを呼び出す
		Actress meiNagano = new Actress("永野芽郁");

		// 引数がintのコンストラクタを呼び出す
		Actress minamiHamabe = new Actress(21);

		// 引数がStringとintのコンストラクタを呼び出す
		Actress aliceHirose = new Actress("広瀬アリス", 27);

	}
}

Actressのコンストラクタを以下の4つ用意しました。

  • 引数なし
  • 引数がStringのみ
  • 引数がintのみ
  • 引数がStringとint

mainメソッドでそれぞれのコンストラクタを呼び出すと実行結果は次のようになります。

引数なしのコンストラクタが呼び出されました!
引数がStringのみのコンストラクタが呼び出されました!名前を設定します
引数がintのみのコンストラクタが呼び出されました!年齢を設定します
引数がStringとintのコンストラクタが呼び出されました!名前と年齢を設定します

それぞれ別のコンストラクタが呼び出されていることが確認できました。

thisを使って他のコンストラクタを呼び出す

先ほどthisを使ってコンストラクタでフィールドに値を設定する方法を解説しました。
実はthisにはもう一つ別の使い方があります。

それはコンストラクタをオーバーロードしている場合にthisを使うことで他のコンストラクタを呼び出すことができます。

thisで他のコンストラクタを呼び出す

thisを使って他のコンストラクタを呼び出す、具体的なサンプルコードは次のようになります。

thisを使って引数がなしのコンストラクタや、引数がStringのみ、intのみのコンストラクタから引数がStringとintのコンストラクタを呼び出しています。

/**
 * 女優クラス
 * @author uhablog
 */
class Actress {

	public String name;

	public int age;

	// 引数なしコンストラクタ
	public Actress() {
		// thisを使って引数がStringとintのコンストラクタを呼び出す
		this("新垣結衣", 33);

		System.out.println("引数なしのコンストラクタが呼び出されました!");
	}

	// 引数がStringのコンストラクタ
	public Actress(String name) {
		// thisを使って引数がStringとintのコンストラクタを呼び出す
		this(name, 33);

		System.out.println("引数がStringのみのコンストラクタが呼び出されました!");
	}

	// 引数がintのコンストラクタ
	public Actress(int age) {
		// thisを使って引数がStringとintのコンストラクタを呼び出す
		this("新垣結衣", age);

		System.out.println("引数がintのみのコンストラクタが呼び出されました!");
	}

	// 引数がStringとintのコンストラクタ
	public Actress(String name, int age) {
		System.out.println("引数がStringとintのコンストラクタが呼び出されました!");
		this.name = name;
		this.age = age;
	}
}


public class Constractor {

	public static void main(String[] args) {

		// 引数なしのコンストラクタを呼び出す
		Actress yuiAragaki = new Actress();
		System.out.println();

		// 引数がStringのコンストラクタを呼び出す
		Actress meiNagano = new Actress("永野芽郁");
		System.out.println();

		// 引数がintのコンストラクタを呼び出す
		Actress minamiHamabe = new Actress(21);
		System.out.println();

		// 引数がStringとintのコンストラクタを呼び出す
		Actress aliceHirose = new Actress("広瀬アリス", 27);
		System.out.println();

	}
}

これを実行すると次のような結果になります。
それぞれのコンストラクタから、引数がStringとintのコンストラクタが呼び出されていることがわかります。

引数がStringとintのコンストラクタが呼び出されました!
引数なしのコンストラクタが呼び出されました!

引数がStringとintのコンストラクタが呼び出されました!
引数がStringのみのコンストラクタが呼び出されました!

引数がStringとintのコンストラクタが呼び出されました!
引数がintのみのコンストラクタが呼び出されました!

引数がStringとintのコンストラクタが呼び出されました!

まとめ

今回はコンストラクタについて詳しく解説してきました。
コンストラクタというのはクラスのインスタンスを作成するときに実行されるメソッドのようなものです。
しかしメソッドとは次のような違いがあります。

  • クラス名と同じ名前
  • 戻り値がない
  • インスタンスが作られたときに実行される

このような違いをしっかりと押さえておきましょう。

コンストラクタではオーバーロードも可能で、複数の引数が違うコンストラクタを用意することができます。
実装効率を高めるためにぜひ覚えておきたいテクニックです。

またコンストラクタでは「this」を使うことがよくあります。
「this」の使い方は主に次の2つが挙げられます。

  • フィールドに値を設定する
  • 別のコンストラクタを呼び出す

以上、コンストラクタについて解説してきました。
「このまま勉強を続けてプログラミングを習得できるか不安」という方におすすめなのがTech Academyの無料メンター相談です。
現役エンジニア講師とマンツーマンで無料相談できます!公式サイトから予約して、独学の不安を解消しましょう!

コメント

タイトルとURLをコピーしました