Javaではクラスのインスタンス生成時に呼び出される、コンストラクタという機能があります。
コンストラクタは、インスタンス生成時に自動で呼び出される性質からクラスのメンバを初期化するときによく使われます。
今回はそんなコンストラクタについて、以下の内容で解説していきます。
- 【基礎】コンストラクタとは
- 【基礎】コンストラクタの使い方
- 【発展】コンストラクタで引数を指定する方法
- 【発展】マルチスレッドでのコンストラクタの使用方法
- 【発展】コンストラクタ参照の方法
- 【発展】メソッドを呼び出し例外が発生する場合
などの応用的な使い方に関しても解説していきます。
今回はそんなコンストラクタの使い方について、わかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
コンストラクタとは
コンストラクタとは、クラスのインスタンス生成時に実行されるメソッドで、主にそのクラスのメンバ変数を初期化するときに使用します。
コンストラクタはインスタンス生成時に呼び出される特別なメソッドで、通常のメソッド同様に引数を指定することも可能です。
コンストラクタの呼び出しは、以下のように記述します。
public class メインクラス名{ public static void main(String[] args) { //インスタンスの生成 クラス名 変数名 = new クラス名(); } } class クラス名{ //コンストラクタ(インスタンス生成時に実行される) public クラス名(){ 初期化処理など } }
コンストラクタはnew演算子を使用して、インスタンス生成時に同名のクラス名を持つメソッドが一度だけ実行されます。
コンストラクタの使い方
コンストラクタを呼び出す方法
ここでは、実際にコンストラクタの基本的な使い方を見ていきましょう。
以下にインスタンスを生成して、コンストラクタを呼び出す方法を記述します。
// ConstructorSample.java class ConstructorSample { String str = "Samurai Engineer"; // コンストラクタ public ConstructorSample() { System.out.println(str); } } // Main.java public class Main { public static void main(String[] args) { //インスタンスの生成 ConstructorSample cs = new ConstructorSample(); } }
実行結果:
Samurai Engineer
サンプルではMain.javaからConstructorSample.javaのクラスのインスタンスを生成しています。
その際にコンストラクタConstructorSampleが呼び出されています。
引数を指定する方法(オーバーロード)
前述したようにコンストラクタはメソッドと同様に引数を指定することもできます。
引数を持つコンストラクタを呼び出す場合は、new演算子でのコンストラクタ生成時にクラスに引数を指定する必要があります。
クラス名 変数名 = new クラス名(引数);
以下に引数を指定したコンストラクタを呼び出す方法を記述します。
// ConstructorSample.java class ConstructorSample { String str1 = "Samurai Engineer"; // コンストラクタ public ConstructorSample() { System.out.println(str1); } // 引数を持つコンストラクタ public ConstructorSample(String str2) { System.out.println(str1 + " " + str2); } } // Main.java public class Main { public static void main(String[] args) { //インスタンスの生成 ConstructorSample cs = new ConstructorSample("blog"); } }
実行結果:
Samurai Engineer blog
サンプルではConstructorSampleクラスに、引数を持たないコンスタラクタと引数を持つコンストラクタを定義しています。
2つのコンストラクタは同名ですが引数の数が違いますので、コンストラクタをオーバーロードしていることになります。
このように同名のコンストラクタが存在する場合、インスタンス生成時にクラスに引数を指定すると、引数を持つコンストラクタが呼び出されます。
引数で渡した値をthisで受け取る方法
コンストラクタの引数で渡した値を「this」句を使って受け取る場合があります。
「this」は「このクラスの」といった意味で、コンストラクタの引数の変数名かそれともこのクラスのメンバ変数名か区別する場合に使用します。
以下に引数で渡した値をthisで受け取るの方法を記述します。
// ConstructorSample.java class ConstructorSample { String str; // 引数を持つコンストラクタ public ConstructorSample(String str) { this.str = str; System.out.println(this.str); } } // Main.java public class Main { public static void main(String[] args) { //インスタンスの生成 ConstructorSample cs = new ConstructorSample("Samurai Engineer"); } }
実行結果:
Samurai Engineer
thisの詳しい使い方はこちらの記事で解説しているので、ぜひ確認してください。
継承したクラスでsuperを使う方法
クラスのメンバを継承するときは、extendsの後にクラス名を指定してクラスを継承します。
しかし、クラスを継承しても子クラス側で親クラスのコンストラクタを、そのまま親クラスのクラス名で呼び出すことはできません。
そのため、小クラスから親クラスのコンストラクタを呼び出すためには「super」を指定する必要があります。そんな継承したクラスのコンストラクタの使用法については、以下の記事で詳しく解説しています!
マルチスレッドでのコンストラクタ
プログラムでは処理を同時進行で処理することを「マルチスレッド」と呼びます。
マルチスレッドはWebサービスやアプリケーションなど、ユーザーからの入力やデータベースへの書き込み・読み込み処理など、さまざまな処理を同時並行して行うときによく使用します。
そんなマルチスレッドの処理では、コンストラクタも重要な役割を果たします。
Javaでのマルチスレッドについては、以下の処理で詳しく解説しています。
コンストラクタ参照
既に定義済みのメソッドを引数なしで呼び出すことをメソッド参照といいます。
メソッド参照はJava8から新しく導入された機能で「クラス名::メソッド名」の形式で使用します。
そんなメソッド参照ですが、コンストラクタを参照するときにも使用することができます。コンストラクタを参照するときは「クラス名::new」の形式で使用します。
コンストラクタを参照する具体的な方法については、以下の記事で詳しく解説しています。
メソッドを呼び出し例外が発生する場合
これまでのサンプルコードでも、コンストラクタからメソッドを呼び出していますが、このメソッドが例外を発生する場合はどのように対応すればいいのでしょうか?
// ConstructorSample.java class ConstructorSample { private String str; // コンストラクタ public ConstructorSample(String str) throws NullPointerException{ this.str = str; System.out.println(this.str.length()); } } //Main.java public class Main { public static void main(String[] args) { String str = null; try { ConstructorSample cs = new ConstructorSample(str); } catch(NullPointerException e) { System.out.println(e); } } }
実行結果:
java.lang.NullPointerException
このサンプルコードでは、コンストラクタの引数のString型変数がnullの場合にNullPointerExceptionの例外が発生します。
ですので、コンストラクタで発生する例外をthrowsで投げて、インスタンスの生成する際にtry-catch文で例外処理を行っています。
例外を投げるようにしておくと、オブジェクトが生成されることがないため、メモリリークや意図しないアクセスなどの不具合が発生することがなくなります。
まとめ
ここでは、Javaのコンストラクタのさまざまな使い方について紹介しました。
コンストラクタはクラスのメンバを初期化したり、初期値を設定するときによく使用しますので、ぜひ覚えておいてくださいね。もし、コンストラクタの使い方を忘れてしまったら、この記事を思い出してください!