コンストラクターチェーンとは何ですか?
Java のコンストラクターは、クラスのオブジェクト作成に使用される特定のメソッドです。コンストラクターは、クラスのオブジェクトが作成されるたびに呼び出されます。これを使用して、作成時にオブジェクトのプロパティに値を割り当てることができます。Java クラスには、異なるパラメーター リストを持つ複数のコンストラクターが存在する場合があります。コンストラクター チェーンは、オブジェクトの作成時に同じクラス/親クラスのコンストラクターのさまざまな実装を呼び出すために使用されます。
コンストラクターチェーンは Java でどのように実装されますか?
コンストラクターを連鎖するには、コンストラクターの呼び出し方法に基づいて 2 つの方法があります。それらは次のとおりです。
- this()キーワードを使用– 同じクラスのコンストラクターを呼び出す
- super()キーワードを使用– 親クラスのコンストラクターを呼び出す
これについては、次の例で説明します。
コンストラクターの連鎖例 #1 – コンストラクターは this() キーワードを使用して連鎖されます
DerivedClass の 4 つのコンストラクターを宣言しました。1 つは引数なしで、他の 3 つは異なる引数を持ちます。各コンストラクター内では、
this()キーワードを使用して、同じクラスの次のコンストラクターを呼び出します。
package com.tutorialwriting.constchaining;
public class DerivedClass{
String firstName;
String country;
int age;
public DerivedClass() {
// calling one argument constructor
this("Maggie");
}
public DerivedClass(String firstName) {
// calling two argument constructor
this(firstName, 15);
}
public DerivedClass(String firstName, int age) {
// calling three argument constructor
this(firstName, age, "Australia");
}
public DerivedClass(String firstName, int age, String country) {
this.firstName = firstName;
this.age = age;
this.country = country;
}
void displayValues() {
System.out.println("First Name : " + firstName);
System.out.println("Country : " + country);
System.out.println("Age : " + age);
}
public static void main(String args[]) {
DerivedClass object = new DerivedClass();
object.displayValues();
}
}
実行の出力
コンストラクターの連鎖例 #2 – コンストラクターは super() キーワードを使用して連鎖されます
ここで、子クラスはsuper()キーワードを使用して親クラスのコンストラクターを呼び出します。BaseClass には 3 つのコンストラクターがあります。
引数のないコンストラクターは、 this()を使用して BaseClass の 3 つの引数を持つコンストラクターの 1 つを呼び出します。
package com.tutorialwriting.constchaining;
public class BaseClass {
public BaseClass() {
//calling a three argument constructor of the same class
this("Male", "English", "1989/11/10");
System.out.println("I'm executed third!!!");
}
public BaseClass(String firstName, String surname, int idNo) {
System.out.println("I'm executed first!");
System.out.println("First name : " + firstName);
System.out.println("Surname : " + surname);
System.out.println("ID Number : " + idNo);
}
public BaseClass(String gender, String nationality, String birthDate) {
System.out.println("I'm executed second!!");
System.out.println("Gender : " + gender);
System.out.println("Nationality : " + nationality);
System.out.println("Birth Date : " + birthDate);
}
}
DerivedClass には 2 つのコンストラクターがあり、それぞれが
super()を使用してスーパークラスの異なるコンストラクターを呼び出します。
package com.tutorialwriting.constchaining;
public class DerivedClass extends BaseClass {
public DerivedClass() {
//calling no argument constructor of the super class
super();
}
public DerivedClass(String firstName, String surname, int idNo) {
//calling three argument constructor of the super class
super(firstName, surname, idNo);
}
public static void main(String args[]) {
DerivedClass object2 = new DerivedClass("Paul", "Wilson", 123456);
DerivedClass object1 = new DerivedClass();
}
}
実行の出力
暗黙的なコンストラクター呼び出しと明示的なコンストラクター呼び出し
Java では、コンストラクターを呼び出すには、暗黙的呼び出しと明示的呼び出しという 2 つの異なる方法があります。
- 明示的な呼び出しとは、 this()またはsuper()を使用してコード内で明示的にコンストラクターを呼び出すことを指します。
- 暗黙的呼び出しとは、子クラス コンストラクターからの明示的な呼び出しがない場合に、スーパー クラスの引数なしのコンストラクターを暗黙的に呼び出すことを指します。つまり、プログラマがコード内で明示的にsuper()を呼び出さない場合、コンパイラは子クラスのコンストラクターの最初の行としてsuper()呼び出しを追加します。
なぜコンストラクターチェーンが必要なのでしょうか?
以下にリストするように、Java でコンストラクター チェーンを使用する目的はいくつかあります。
- これは、他のコンストラクターのプロパティまたは親クラスのプロパティにアクセスする方法です。
- 他のコンストラクターを呼び出すときは、クラスの現在のインスタンスである 1 つのオブジェクトのみが使用されます。初期化は 1 か所で行われますが、チェーンを通じてさまざまなコンストラクター実装を呼び出すことができます。これは、メモリ管理とコードのメンテナンスに非常に役立ちます。
結論
このチュートリアルでは、Java のコンストラクター チェーンについて説明しました。コンストラクターは、オブジェクトの作成中に呼び出されるメソッドに似たコード セグメントです。Java クラスには、異なるパラメーター リストを持つ任意の数のコンストラクターを含めることができます。コンストラクター チェーンは、クラスの 1 つのインスタンスでさまざまな初期化を処理する便利な方法です。このチュートリアルで注目すべきいくつかの重要な点を以下に示します。
- プログラマがコードに明示的に追加しない場合、コンパイラは引数のないパブリック コンストラクタを Java クラスに追加します。これはデフォルトのコンストラクターと呼ばれます。
- this()とsuper() はコンストラクターの最初の行として記述する必要があります。
- this()は同じクラスのコンストラクターを呼び出すために使用され、super() は直接のスーパークラスのコンストラクターを呼び出すために使用されます。
- クラス内には、this()キーワードを含まないコンストラクターが少なくとも 1 つ存在する必要があります。
- 明示的に追加しない場合、コンパイラは引数なしのsuper()呼び出しをすべての子クラス コンストラクターに追加します。これは、クラスを正しくインスタンス化するのに役立ちます。
GO TO FULL VERSION