Java言語で実装を進めていく上で、理解しておくべき機能の1つに「コンストラクタ」の存在が挙げられます。
コンストラクタは、クラスからインスタンスを生成する際に自動で呼び出される性質をもち、特に処理が記述されていないことも多いため、曖昧な理解となりがちです。
本記事では、Java言語におけるコンストラクタの使い方を、初心者の方でも理解していただけるよう概要から基礎的な部分を中心に、サンプルコードをまじえながらご紹介していきたいと思います。
Javaコンストラクタを理解しよう
Javaに限らずですが、オブジェクト指向のプログラミング言語には「コンストラクタ」という機能が存在します。
まずコンストラクタの概念についてご紹介していきます。
コンストラクタとは?
コンストラクタとは、オブジェクト指向のプログラミングで利用される「クラス」の処理を実行するために「インスタンス」を生成する際に実行される機能を指します。
実際にJavaでクラスからインスタンスを生成する場合には「new」演算子を利用しますが、この「new」を実行した際に「コンストラクタ」の機能が呼び出される形となります。
コンストラクタは何のために使うの?
コンストラクタでは一般的にインスタンスを作成する際に「初期値」を設定するような処理を記述します。
クラスで利用される値を保存する「メンバ変数」を初期化するための処理が頻繁に記述されます。
Javaコンストラクタの基本的な使い方を抑えよう
ここからは、Javaにおけるコンストラクタの基本的な使い方をサンプルコードを交えながらご紹介していきたいと思います。
コンストラクタの基本構文
コンストラクタはクラス名と同じ名前のメソッドで定義しておく必要があります。
記述方法としては下記のサンプルコードのようになります。
public class ClassA { // コンストラクタ public ClassA() { // 処理を記述 } }
今回のサンプルでは「ClassA」というクラスファイルを定義しており、クラス名と同名のメソッドとなる「ClassA」がコンストラクタです。
ここで記述した処理がインスタンス生成時に実行されることとなります。
注意すべき点としては、コンストラクタは値を返却することが出来ないため「return」の処理を記述するとエラーとなってしまいます。
コンストラクタの呼び出し方は?
コンストラクタはインスタンス生成時に呼び出されるとご紹介しましたが、実際にコードではどのように記述されるのか確認していきましょう。
// ClassAのインスタンスを生成する ClassA sampleInstance = new ClassA();
上記のようにClassAをインスタンス化するタイミングでコンストラクタが呼び出されます。
Javaコンストラクタの応用的な使い方を確認しよう
ここからは更に一歩踏み込んでJavaコンストラクタの応用的な使い方をご紹介したいと思います。
コンストラクタを使いこなすことで、より綺麗なコードを記述出来ますのでしっかりと学習していきましょう。
コンストラクタには引数を渡すことが出来る!
コンストラクタには引数として値を渡すことが可能となっています。
初期値としてメンバ変数に設定する値を変更したい場合など、様々な場面で利用出来る便利な機能です。
記述方法としては下記のサンプルコードのようになります。
public class ClassA { // メンバ変数 String sample1; // 引数なし public ClassA() { // 処理を記述 } // 引数あり public ClassA(String str) { // メンバ変数に引数の値を設定 sample1 = str; } }
サンプルコードでは引数ありのコンストラクタで、引数に指定された値をメンバ変数に設定する処理を記述しています。
呼び出し元のコードは下記のようになります。
// ClassAのインスタンスを生成する ClassA sampleInstance = new ClassA("りんご");
サンプルコードを実行すると「りんご」がメンバ変数のsample1に設定された状態でインスタンスが作成される結果となります。
同名のコンストラクタを複数定義することも可能?!
ここで気付いた方もいらっしゃるかも知れませんが、上記のサンプルで「ClassA」という同じ名前のコンストラクタが2つ記述されていますね。
実は、Javaでは同名のコンストラクタを複数定義することが可能です。
引数により同名のメソッドを複数作成することを「オーバーロード」と呼び、コンストラクタでも利用することが可能です。
オーバーロードを利用する際には、「引数の型」または「引数の数」が異なることが条件となります。
記述方法としては下記のサンプルコードのようになります。
public class ClassA { // 引数なし public ClassA() { // 処理を記述 } // String型の引数あり public ClassA(String str) { // 処理を記述 } // Integer型の引数あり public ClassA(Integer int) { // 処理を記述 } // String型の引数が2つ publec ClassA(String str1, String str2) { // 処理を記述 } // String型とInteger型の引数が1つずつ public ClassA(String str, Integer int) { // 処理を記述 } }
呼び出し元のコードは下記のようになります。
ここでは、String型の引数とInteger型の引数が1つずつ定義されたコンストラクタを呼び出してみます。
// String型とInteger型の引数が定義されたコンストラクタが呼び出される ClassA sampleInstance = new ClassA("りんご", 1);
1つ目の引数にString型である「りんご」2つ目の引数にInteger型の「1」を定義しています。
引数の順番を反対にした下記のような記述をした場合には、サンプルコードでは定義されたコンストラクタが存在しないためエラーとなりますので注意してください。
// 定義されたコンストラクタが存在しないためエラー ClassA sampleInstance = new ClassA(1, "りんご");
まとめ
本記事では、コンストラクタの概念からJavaにおけるコンストラクタの基本的な実装方法までをご紹介してきました。
近年の開発では、eclipseを筆頭としたIDEの台頭により、コンストラクタが自動で生成されることも多いため、しっかりとコンストラクタの概念を理解していないプログラマーの方も少なからずいらっしゃいます。
これまでいまいちコンストラクタについて理解していなかった方も、本記事でご紹介した情報をしっかりと理解して、便利で効果的なコンストラクタを使いこなせるようにぜひ挑戦してみてください。
コンストラクタで「メンバ変数」を初期化することにより、新たに作成したインスタンスのメンバ変数が必ず指定した値になっていることが保証されます。