前回は「メソッド」と「変数」について説明しました。
今回は「コンストラクタ」と「staticイニシャライザ」について説明します。
◆コンストラクタ
コンストラクタは、クラスをインスタンス化するときに呼ばれる特殊なメソッドです。
「オブジェクトを初期化する」、という役割を持っています。
初期化をするメソッドですので、インスタンス化した際はまずこのコンストラクタというメソッドが呼ばれます。
構文は
修飾子 コンストラクタ名 (引数の型 引数名1, 引数の型 引数2・・・) {
コンストラクタ内の処理;
}
コンストラクタの特徴は
- コンストラクタ名はクラス名と同じ
- 戻り値がない
- voidも必要ない
この3点です。
前回のサンプルプログラム(Sample8_2)でもコンストラクタがでてきていました。
class Dog { static int count; // static変数 String name; // インスタンス変数 String kensyu; // インスタンス変数 public Dog(String n, String k) { // コンストラクタ name = n; // ローカル変数 kensyu = k; count++; } String getName() { // getNameメソッド return name; // 戻り値name } String getKensyu() { // getKensyuメソッド return kensyu; // 戻り値kensyu } }
6行目を見てください。
メソッド名がDogでクラス名と同じです。
そしてreturnもありませんし、voidもありません。
これがコンストラクタです。
ここでクラスがインスタンス化されたときにオブジェクトの初期化を行っています。
ではもっとシンプルなサンプルをみてみましょう。
Sample9_1
class SampleCon1 { SampleCon1() { System.out.println("コンストラクタが呼ばれました"); } } public class Sample9_1 { public static void main(String[] args) { SampleCon1 c = new SampleCon1(); } }
実行結果
コンストラクタが呼ばれました
まずSampleConクラスがあります。
その中にコンストラクタの記述があります。(2~4行目)
コンストラクタが呼ばれると、”コンストラクタが呼ばれました”と出力させる処理が書かれています。
実際行目でSampleConクラスをインスタンス化しています。
するとこの時点でコンストラクタが呼ばれ、実行結果が表示されます。
では少しアレンジを加えてみます。
Sample9_2
class SampleCon2 { SampleCon2() { System.out.println("コンストラクタが呼ばれました"); } } public class Sample9_2 { public static void main(String[] args) { SampleCon2 c1 = new SampleCon2(); SampleCon2 c2 = new SampleCon2(); SampleCon2 c3 = new SampleCon2(); } }
実行結果
コンストラクタが呼ばれました
コンストラクタが呼ばれました
コンストラクタが呼ばれました
今度は3回出力されます。
コンストラクタはオブジェクトの初期化です。
つまり、オブジェクトが生成される度にコンストラクタは呼ばれるのです。
Sample9_2ではc1、c2、c3と3つオブジェクトが作成されているので、3回出力が行われるのです。
もしコンストラクタの記述がない場合は、引数も処理内容もない「デフォルトコンストラクタ」が呼ばれます。
◆staticイニシャライザ
オブジェクトの初期化はコンストラクタ以外にstaticイニシャライザがあります。
構文は次のようになっています。
static {
処理;
}
早速サンプルをみてみましょう。
class SampleStIni { static { System.out.println("staticイニシャライザが呼ばれました"); } } public class Sample9_3 { public static void main(String[] args) { SampleStIni st1 = new SampleStIni(); SampleStIni st2 = new SampleStIni(); SampleStIni st3 = new SampleStIni(); } }
実行結果
staticイニシャライザが呼ばれました
今回はオブジェクトを3つ作成したのに出力は1回だけしかされません。
staticイニシャライザはオブジェクトを作成する度にではなく、初めて参照されたときのみ実行されます。
ここがコンストラクタとの違いです。
staticは1つ。各オブジェクトがそれぞれ持つものではありません。
そのため初めに参照したときだけしか実行されません。
Sample9_3では8行目で呼ばれています。
◆ポイントまとめ
- コンストラクタ
オブジェクトが生成される度に呼ばれ、オブジェクトを初期化する。 - staticイニシャライザ
初めて参照されたときのみ呼ばれ、オブジェクトを初期化する。
この2つの違いに注意して下さい。
今回はここまでとします。