Java で別のコンストラクタを呼び出す
Java では、オブジェクトの初期化時にコンストラクタを呼び出す順序をコンストラクタチェイニングと呼びます。これは、1つのインスタンスを使用して次から次へとコンストラクタを呼び出したい場合に使用されます。
Java での同じクラス内でのコンストラクタの呼び出し
同じクラス内の別のコンストラクタからあるコンストラクタを呼び出したい場合は、this
キーワードを使用します。this
キーワードを使用する式は、コンストラクタの最初の行でなければなりません。コンストラクタの連鎖では順序は関係ありません。this
キーワードを使用しないコンストラクタを少なくとも 1つは持たなければなりません。
以下の例では、3つのコンストラクタを持つクラス Test
があります。1つはパラメータを持たないデフォルトのもので、他の 2つはパラメータ化されています。main
メソッドでは、パラメータを渡さずに new
キーワードを用いてクラスオブジェクトのインスタンスを作成します。
これはデフォルトのコンストラクタ Test()
を呼び出し、パラメータ化されたコンストラクタ Test(String name)
の呼び出しを this("Steve")
を用いてリダイレクトします。コンストラクタ Test(String name)
はさらに別のパラメータ化されたコンストラクタ Test(int age, String place)
を this(30,"Texas")
を用いて呼び出しをリダイレクトします。
Test(int age, String place)
の中の文が最初に実行されています。その後、残りの Test(String name)
コンストラクタの文が実行されています。最後にデフォルトのコンストラクタの残りの文が実行され、オブジェクトの初期化に成功します。
public class Test {
Test() {
this("Steve");
System.out.println("Default Constructor");
}
Test(String name) {
this(30, "Texas");
System.out.println("Name - " + name);
}
Test(int age, String place) {
System.out.println("Age- " + age + ", place- " + place);
}
public static void main(String[] args) {
Test test = new Test();
}
}
出力:
Age- 30, place- Texas
Name - Steve
Default Constructor
Java の基底クラスから別のコンストラクタを呼び出す
継承関係のあるクラスが複数ある場合、子クラスから親クラスのコンストラクタを呼び出すために super
キーワードを使用する必要があります。this
キーワードとは異なり、JVM は自動的に super
キーワードを入れます。
基底クラスは派生クラスによって拡張された親クラスです。クラスオブジェクトをインスタンス化するメインメソッドは、同じクラスのデフォルトコンストラクタを呼び出し、さらに this("Adam")
を使って子クラスのパラメータ化されたコンストラクタへの呼び出しをリダイレクトします。
super(name)
は Base
クラスのパラメータ化されたコンストラクタ Base(String name)
を呼び出します。デフォルトのコンストラクタは this()
を用いて呼び出す。クラス変数もここで this.name = name
で初期化されています。
Base
クラスのデフォルトコンストラクタ内のコードが実行されています。その後、パラメータ化されたコンストラクタ Base(String name)
の内部の文が実行されています。最後に、Derived
クラスのパラメータ化されたコンストラクタ内の残りの文が実行されています。
class Base {
String name;
Base() {
System.out.println("Default Constructor Base Class");
}
Base(String name) {
this();
this.name = name;
System.out.println("Parameterized Constructor Base Class called:- " + name);
}
}
class Derived extends Base {
Derived() {
this("Adam");
}
Derived(String name) {
super(name);
System.out.println("Parameterized Constructor Derived Class called: " + name);
}
public static void main(String[] args) {
Derived derived = new Derived();
}
}
出力:
Default Constructor Base Class
Parameterized Constructor Base Class called:- Adam
Parameterized Constructor Derived Class called: Adam
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn