HOWTO · Java

Java で別のコンストラクタを呼び出す

このチュートリアルでは、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