「コンストラクタ」とはインスタンスが作られた直後に一度だけ自動的に呼び出される特殊なメソッドです。
コンストラクタはフィールドの初期化やリソースの初期化(具体的にはメモリ確保やファイル・デバイスのオープンなど)に良く使われています。
以下のコードは Score クラスにコンストラクタを追加した例です。
public class Score { public int math; public int english; // コンストラクタ(引数なし) public Score(){ System.out.println("引数なしコンストラクタ実行"); } // 以下のメソッド(average, set_math) は変更無し public double average(){ return (math + english)/2.0; } public void set_math( int s ){ math = s; } }
ソース1のフィールド定義の下にある「public SCORE()」がコンストラクタで、
という特徴があります。
ではこの Score クラスを次に示すメインメソッドから使ってみましょう。
public class Main{ public static void main(String[] args) { Score sc_taro = new Score(); sc_taro.math = 5; sc_taro.english = 3; Score sc_hanako = new Score(); sc_hanako.math = 80; sc_hanako.english = 70; System.out.println( "太郎: math = " + sc_taro.math+ " english = " + sc_taro.english + " 平均 = " +sc_taro.average()); System.out.println( "花子: math = " + sc_hanako.math+ " english = " + sc_hanako.english + " 平均 = " +sc_hanako.average()); } }
実行結果は次の様になります。
引数なしコンストラクタ実行 引数なしコンストラクタ実行 太郎: math = 5 english = 3 平均 = 4.0 花子: math = 80 english = 70 平均 = 75.0
このように、「インスタンスが作成された時にコンストラクタが自動的に実行され」て"引数なしコンストラクタ実行"という文字列が表示されています。
なおコンストラクタは他のメソッドと同様に引数を使うことが出来ます(ソース3)。
public class Score { public int math; public int english; // コンストラクタ(引数有り) public Score( int m, int e ){ System.out.println("引数有りコンストラクタ実行"); math = m; english = e; } // 以下のメソッド(average, set_math) は変更無し public double average(){ return (math + english)/2.0; } public void set_math( int s ){ math = s; } }
ソース3 の Score クラスを次のメインメソッドから使ってみます。
(1)、(2)の行に注目して下さい。
public class Main{ public static void main(String[] args) { Score sc_taro = new Score( 5, 3 ); // (1) Score sc_hanako = new Score( 80, 70 ); // (2) System.out.println( "太郎: math = " + sc_taro.math+ " english = " + sc_taro.english + " 平均 = " +sc_taro.average()); System.out.println( "花子: math = " + sc_hanako.math+ " english = " + sc_hanako.english + " 平均 = " +sc_hanako.average()); } }
実行結果は次の通りです。
引数有りコンストラクタ実行 引数有りコンストラクタ実行 太郎: math = 5 english = 3 平均 = 4.0 花子: math = 80 english = 70 平均 = 75.0
今度のコンストラクタは引数「 int m, int e 」を持っていて、メインメソッドの(1)、(2)でインスタンスを作成すると同時に math と english の初期値をコンストラクタに渡しています。
ちなみにインスタンスがメモリから削除される時に一度だけ自動実行される「デストラクタ」や「ファイナライザ」という特殊メソッドを持つプログラミング言語もあります。
これらについては今回のアクティビティでは取り扱いませんので、もし興味があれば自分で調べてみましょう。