Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaコンストラクタの使い方を徹底解説!基本ルールから実践例まで

Javaでは、特定の処理を行うコードのまとまりを「メソッド」として定義します。メソッドを扱っていると、コンストラクタ(constructor)という概念に出会うことがあります。

コンストラクタは、Javaでオブジェクトを初期化するための特別なメソッドです。クラスのオブジェクトが生成されるタイミングで自動的に呼び出され、オブジェクトの属性に初期値を設定する役割を担います。

この記事では、具体例を交えながらJavaコンストラクタの基本と、コード内での使い方について詳しく解説します。読み終える頃には、コンストラクタを使いこなしてオブジェクトを自在に初期化できるようになっているはずです。

Javaコンストラクタとは

コンストラクタは、新しく作成されたオブジェクトがプログラム内で使用される前に、そのオブジェクトを初期化するための仕組みです。たとえば、「Supplier(仕入先)」という名前のコンストラクタを呼び出せば、仕入先のデフォルト属性を持つオブジェクトが生成されます。

コンストラクタには、次のような特徴があります。

  • クラス名と同じ名前を持つ
  • 戻り値を返さない

以下は、Javaにおけるコンストラクタの基本的な記述例です。

class Supplier {
	Supplier() {
		// ここに処理を記述
	}
}

この例では、クラス名と同じSupplierという名前のコンストラクタを宣言しています。また、このコンストラクタにはvoidなどの戻り値の型が存在しません。これこそが、コンストラクタを通常のメソッドと区別するポイントです。

コンストラクタを宣言する際には、次の2つのルールを押さえておきましょう。

  • ルール1: コンストラクタの名前は、それが宣言されているクラスの名前と完全に一致しなければならない
  • ルール2: コンストラクタは値を返してはならない

Javaコンストラクタの作成方法

Javaのコンストラクタには、「引数なしコンストラクタ」と「パラメータ化コンストラクタ」の2種類があります。ここからは、それぞれの作成方法を順番に見ていきましょう。

引数なしコンストラクタ(No-arg Constructor)

まずは、食料品店を経営している場面を想定してみましょう。チーズの主要仕入先の情報を保存するプログラムを作成したいとします。このプログラムには、仕入先の情報を格納するコンストラクタが必要で、さらにその値をコンソールに出力できるようにします。

このプログラムを作成するためのコードは以下の通りです。

class MainCheeseSupplier {
	private String name;
	private String address;
	private int discountRate;
	private String payDate;

	private MainCheeseSupplier() {
		name = "J. Acker Dairy";
		address = "1600 Johnson Ave. San Francisco 94127";
		discountRate = 2;
		payDate = "Last day of the month.";
	}

	public static void main(String[] args) {
		MainCheeseSupplier jadairy = new MainCheeseSupplier();

		System.out.println("Name: " + jadairy.name);
		System.out.println("Address: " + jadairy.address);
		System.out.println("Discount rate: " + jadairy.discountRate);
		System.out.println("Pay date: " + jadairy.payDate);
	}
}

このコードを実行すると、次の出力が得られます。

Name: J. Acker Dairy
Address: 1600 Johnson Ave. San Francisco 94127
Discount rate: 2
Pay date: Last day of the month.

まず、プログラムのコードを格納するMainCheeseSupplierというクラスを定義しています。続いて、主要なチーズ仕入先の情報を保存するための4つのprivate変数——nameaddressdiscountRatepayDate——を宣言しました。

変数を宣言した後、それらにデフォルト値を設定するMainCheeseSupplierというコンストラクタを作成します。そして、mainメソッド内で次のコードを使って、コンストラクタのインスタンスを初期化します。

MainCheeseSupplier jadairy = new MainCheeseSupplier();

このコードにより、変数jadairyMainCheeseSupplierオブジェクトの新しいインスタンスが代入されます。その後、jadairy変数とアクセスしたい属性を参照することで、各値をコンソールに出力しています。

これは引数なしコンストラクタの一例です。コンストラクタが一切のパラメータを受け取らないため、「no-arg(引数なし)」と呼ばれます。

パラメータ化コンストラクタ

しかし、コンストラクタに引数を渡したいケースもあるでしょう。

再び食料品店の例に戻ります。今度は、主要なチーズ仕入先の詳細な値をmainメソッド側で定義し、プログラムの実行開始時にコンストラクタへ渡して割り当てたいとします。

このようにする理由としては、異なる値を持つ複数の仕入先を初期化したい場合や、コンストラクタ自体に固定の値を埋め込みたくない場合などが考えられます。

コンストラクタに引数を渡す形式のものを、パラメータ化コンストラクタと呼びます。

パラメータリストをコンストラクタに渡すコードは、次のように記述できます。

class MainCheeseSupplier {
	String name;
	String address;
	int discountRate;
	String payDate;

	public MainCheeseSupplier(String supplierName, String supplierAddress, int supplierDiscountRate, String supplierPayDate) {
		name = supplierName;
		address = supplierAddress;
		discountRate = supplierDiscountRate;
		payDate = supplierPayDate;
	}

	public static void main(String[] args) {
		MainCheeseSupplier jadairy = new MainCheeseSupplier("J. Acker Dairy", "1600 Johnson Ave. San Francisco 94127", 2, "Last day of the month.");

		System.out.println("Name: " + jadairy.name);
		System.out.println("Address: " + jadairy.address);
		System.out.println("Discount rate: " + jadairy.discountRate);
		System.out.println("Pay date: " + jadairy.payDate);
	}
}

このコードを実行すると、出力結果は最初の例とまったく同じになります。

Name: J. Acker Dairy
Address: 1600 Johnson Ave. San Francisco 94127
Discount rate: 2
Pay date: Last day of the month.

出力は同じですが、コードには大きな違いが一つあります。それは、コンストラクタ内部で値を初期化するのではなく、インスタンスを宣言するタイミングでパラメータとして値を渡しているという点です。

上記の例では、MainCheeseSupplierコンストラクタがsupplierNamesupplierAddresssupplierDiscountRatesupplierPayDateという4つのパラメータを受け取ります。インスタンスを初期化する際にこれらのパラメータへ値を渡すと、コンストラクタがその値を読み取って各フィールドに代入します。インスタンスを初期化するコードは以下の通りです。

MainCheeseSupplier jadairy = new MainCheeseSupplier("J. Acker Dairy", "1600 Johnson Ave. San Francisco 94127", 2, "Last day of the month.");

その後、MainCheeseSupplierコンストラクタに格納された値の内容を出力しています。

まとめ

Javaのコンストラクタは、オブジェクトを初期化するために使われる特別なメソッドです。クラスのオブジェクトが生成されるときに呼び出され、オブジェクトの属性に初期値を設定するために利用できます。

この記事では、具体例を参考にしながら、Javaでコンストラクタを作成し活用する方法を解説しました。これであなたも、プロフェッショナルのようにJavaコンストラクタを使いこなせるはずです。

  1. JavaのMath.random()メソッド徹底解説!乱数生成の基本から範囲指定まで

    JavaのMath.random()メソッドは、0.0以上1.0未満の擬似乱数(疑似ランダムな数値)を生成するためのメソッドです。生成された乱数に別の数値を掛けることで、0〜1以外の任意の範囲の乱数を取得することもできます。結果が0になることはあっても、1以上になることはありません。 プログラミングで乱数が必要になる場面 プログラミングをしていると、ランダムな数値を生成したい場面によく出会います。例えば、クルーズ船会社を運営しているとしましょう。顧客の注文番号として使う予約参照番号をランダムに生成したり、数当てゲーム用のランダムな数字を作りたいといったケースが考えられます。 Javaには、乱

  2. C#の静的コンストラクターとは?特徴・実行タイミング・注意点を解説

    静的コンストラクターとは 静的コンストラクター(static constructor)は、静的なデータを初期化したり、一度だけ実行すればよい特定の処理を行うために使用されます。最初のインスタンスが生成される前、またはいずれかの静的メンバーが参照される前に、自動的に呼び出されるのが大きな特徴です。 静的コンストラクターは、アンマネージコード用のラッパークラスを作成する際に特に有用です。この場合、コンストラクター内でLoadLibraryメソッドを呼び出すことができます。また、制約(constraints)ではコンパイル時にチェックできない型パラメーターに対して、実行時の検証を行う場所としても適し