インスタンスの生成

 Java言語では,クラスからインスタンスを生成してクラスの機能を利用します。まず実際のコードを見てみましょう。

public class MyClass {
  public static void main(String[] args) {
    String myName = new String();
  }
}

 このコードでは,StringクラスのインスタンスmyNameを生成しています。この場合,Stringがクラスの名前,myNameはインスタンスの参照変数,newはインスタンスの生成を実行する演算子です。String()は,Stringクラスのインスタンスを生成するための記述で,クラス名にパラメータを囲む「()カッコ」を付けて記述します。つまり,クラスからインスタンスを生成するには,以下のような構文を実行する必要があります。

クラス名 参照変数名= new クラス名(コンストラクタのパラメータ);

 この構文では,インスタンスの生成と参照変数の宣言と初期化を同時に行っています。それぞれの要素を説明していきましょう。

参照変数

 Java言語では,生成したインスタンスをそのまま使いません。必ず参照変数にインスタンスの参照を代入して参照変数を経由してインスタンスにアクセスします。そのため,インスタンスを使う場合は,必ず参照変数を宣言します。参照変数の宣言は,以下のようになります。

クラス名 参照変数名;

 例えばStringクラスのインスタンスの参照を格納できる参照変数myNameの宣言は以下のようになります。

String myName;

このままでは,myNameには,nullという特殊な値が入っているだけで,何も入っていません。ただ,Stringクラスのインスタンスを格納できるというだけです。そこで,次にインスタンスの生成をするnew演算子が必要になります。

new演算子

 インスタンスを生成するには,クラスのコンストラクタを呼ぶ必要があります。このコンストラクタを呼ぶことができるのがnew演算子です。

 new演算子は,生成されたインスタンスの参照を返します。そのため,そのインスタンスの参照を受け取る参照変数にnew演算子の戻り値を返す必要があります。また,new演算子が呼び出すコンストラクタも指定しなければいけません。

コンストラクタ

 コンストラクタとは,インスタンスを生成するときに呼ばれる特殊なメソッドのようなものです。コンストラクタは,クラスの中で定義されますが,メソッドと違って戻り値を持ちません。また,名前はクラスとまったく同じでなければいけません。コンストラクタの定義は以下のようになります。

public class MyName {
  public MyName() { // コンストラクタ
    // 処理
  }
}

 このように,コンストラクタは,メソッドとよく似ています。しかし,メソッドともっとも違う点は,インスタンスの生成時にnew演算子によって呼び出される点です。上記のMyNameクラスのインスタンスを生成する場合は下記のようなコードになります。

public class MyClass {
  public static void main(String[] args) {
    MyName mn = new MyName();
  }
}

 このコードでは,クラスMyNameのインスタンスを生成して,MyNameクラスの参照を参照変数mnに代入しています。このとき,MyName()というコンストラクタが呼び出されます。

 コンストラクタには,引数を持つものも定義できます。

public class MyName {
  public MyName(int x,int y) { // 引数のあるコンストラクタ
    // 処理
  }
}

この場合の,コンストラクタの呼び出しは,引数を渡します。

public class MyClass {
  public static void main(String[] args) {
    MyName mn = new MyName(3,4);
  }
}
class MyName {
  public MyName(int x,int y) { // 引数のあるコンストラクタ
    // 処理
  }
}

 もし,クラスにコンストラクタが定義されていなくても,引数の無いコンストラクタ「デフォルトコンストラクタ」が暗黙に定義されているので,new演算子で指定するクラス名の後ろには、必ず「()カッコ」を指定しなければいけません。つまり,

public class MyName {
}

のようなクラスであっても,暗黙に下記のようなコンストラクタが定義されています。

public class MyName {
  public MyName() {}
}