>> Java入門トップに戻る
今回はJavaのクラスのコンストラクタの作成について説明します。
コンストラクタとはクラスのインスタンスが生成された時に自動的に実行されるメソッドのことです。
このコンストラクタでフィールドの初期化や、他のクラスのインスタンス生成などの処理を行ったりします。
それではまずコンストラクタを定義した以下のコードを見てください。
しかもこのメソッド「返り値」の指定がありません。
実はこれが「コンストラクタ」なのです。
コンストラクタの作成方法は「返り値の指定がなく、クラスと同名のメソッドを作成」することで、コンストラクタが作成できます。
コンストラクタは「new」でインスタンスを生成した時に実行されます。
上記のコードではmain関数内で「Test2」クラスのインスタンスを生成してます。
この時点でコンストラクタが実行され、フィールド「valiue」には5が代入されています。
20行目でTest2クラスのメソッド「geValue」を実行して、フィールド「value」の値を表示しています。
実行してみるとわかりますが、コンソールに「5」と表示されます。
これがコンストラクタの仕組みです。
同じ名前のメソッドを多重定義することをオーバーロードといいますが、コンストラクタもオーバーロードが可能というわけです。
それでは以下のコードを見てください。
このように「引数の数」や「引数の型」「引数の型の順番」などを変えてコンストラクタを区別できるように定義することで、コンストラクタを多重定義することが出来ます。
ではコンストラクタを多重定義している場合の呼び出し方ですが、呼び出し側で「インスタンス作成時に指定する引数によってどのコンストラクタが呼び出されるかが決定」されます。
1つ目のnewを見てください。
Test2()だけ書いていて引数を指定してません
ですので、引数が何もないコンストラクタ1が実行され、「5」が表示されます。
2つ目のnewでは引数に10とだけ指定しています。
コンストラクタの中で引数にint型の値を一つだけ指定するコンストラクタはコンストラクタ2です。
なのでコンストラクタ2が実行され、「10」が表示されます。
3つ目のnewでは引数に10と20が指定されています。
コンストラクタの中で引数にint型の値を二つ指定するコンストラクタはコンストラクタ3です。
なのでコンストラクタ3が実行され、「30」が表示されます。
このように引数の数や型、順番を変えることで複数のコンストラクタを定義することが出来ます。
他の言語ではメモリの確保と解放のためにデストラクタを使うことはよくありましたが、Javaでは「仮想マシンが不要になったオブジェクトのメモリを自動的に解放してくれる」ことから、デストラクタは不要になるため、デストラクタは存在しないのです。
このように「不要になったメモリを自動的に解放してくれる機能」のことを「ガベージコレクション」と言います。
>> 【デフォルトコンストラクタ】に進む
>> Java入門トップに戻る
コンストラクタの作成、オーバーロード
コンストラクタとはクラスのインスタンスが生成された時に自動的に実行されるメソッドのことです。
このコンストラクタでフィールドの初期化や、他のクラスのインスタンス生成などの処理を行ったりします。
それではまずコンストラクタを定義した以下のコードを見てください。
package base; public class Test2 { private int value; //戻り値無し&クラス名と同じ名前のメソッドでコンストラクタになる Test2(){ value = 5; } //mainメソッド public static void main(String[] args){ //インスタンスを生成 Test2 obj = new Test2(); //valueの値を表示 System.out.println(obj.getValue()); } //valueの値を返すgetValueメソッド public int getValue(){ return value; } }上記では「Test2」というクラスを定義しましたが、そのクラス名と同じ「Test2」というメソッドを定義しています。
しかもこのメソッド「返り値」の指定がありません。
実はこれが「コンストラクタ」なのです。
コンストラクタの作成方法は「返り値の指定がなく、クラスと同名のメソッドを作成」することで、コンストラクタが作成できます。
コンストラクタは「new」でインスタンスを生成した時に実行されます。
上記のコードではmain関数内で「Test2」クラスのインスタンスを生成してます。
この時点でコンストラクタが実行され、フィールド「valiue」には5が代入されています。
20行目でTest2クラスのメソッド「geValue」を実行して、フィールド「value」の値を表示しています。
実行してみるとわかりますが、コンソールに「5」と表示されます。
これがコンストラクタの仕組みです。
コンストラクタのオーバーロード(多重定義)
実はコンストラクタは多重定義することが出来ます。同じ名前のメソッドを多重定義することをオーバーロードといいますが、コンストラクタもオーバーロードが可能というわけです。
それでは以下のコードを見てください。
package base; public class Test2 { private int value; //コンストラクタ1 Test2(){ value = 5; } //コンストラクタ2 Test2(int tmp){ value = tmp; } //コンストラクタ3 Test2(int x,int y){ value = x + y; } //mainメソッド public static void main(String[] args){ //コンストラクタ1を実行 Test2 obj = new Test2(); //valueの値を表示 System.out.println(obj.getValue()); //コンストラクタ2を実行 obj = new Test2(10); System.out.println(obj.getValue()); //コンストラクタ3を実行 obj = new Test2(10,20); System.out.println(obj.getValue()); } //valueの値を返すgetValueメソッド public int getValue(){ return value; } }上記のコードではコンストラクタ「Test2」を「引数の数や型を変えて」多重定義しています。
このように「引数の数」や「引数の型」「引数の型の順番」などを変えてコンストラクタを区別できるように定義することで、コンストラクタを多重定義することが出来ます。
ではコンストラクタを多重定義している場合の呼び出し方ですが、呼び出し側で「インスタンス作成時に指定する引数によってどのコンストラクタが呼び出されるかが決定」されます。
1つ目のnewを見てください。
Test2()だけ書いていて引数を指定してません
ですので、引数が何もないコンストラクタ1が実行され、「5」が表示されます。
2つ目のnewでは引数に10とだけ指定しています。
コンストラクタの中で引数にint型の値を一つだけ指定するコンストラクタはコンストラクタ2です。
なのでコンストラクタ2が実行され、「10」が表示されます。
3つ目のnewでは引数に10と20が指定されています。
コンストラクタの中で引数にint型の値を二つ指定するコンストラクタはコンストラクタ3です。
なのでコンストラクタ3が実行され、「30」が表示されます。
このように引数の数や型、順番を変えることで複数のコンストラクタを定義することが出来ます。
Javaのデストラクタは?
C++等の他の言語を勉強した方は「Javaのデストラクタはないのか?」と疑問に思う人がいるかもしれません。他の言語ではメモリの確保と解放のためにデストラクタを使うことはよくありましたが、Javaでは「仮想マシンが不要になったオブジェクトのメモリを自動的に解放してくれる」ことから、デストラクタは不要になるため、デストラクタは存在しないのです。
このように「不要になったメモリを自動的に解放してくれる機能」のことを「ガベージコレクション」と言います。
>> 【デフォルトコンストラクタ】に進む
>> Java入門トップに戻る