Javaには、コンストラクタと呼ばれる特殊な宣言が存在します。
フィールド変数の初期化などによく使用される機能で、コンストラクタを使ってオブジェクトの初期状態を保証することにより、クラスを扱いやすくすることができます。
今回は、コンストラクタの具体的な使い方について詳しく解説をしていきたいと思います。
Javaのコンストラクタとは?
コンストラクタとは、クラスのインスタンスを生成する際に自動で実行される宣言要素のことを言います。
インスタンスの生成と同時に必ず実行されるため、主に初期化処理を行うために使用されており、変数に初期値を代入するなどの設定を自動で行うことができるメリットがあります。
コンストラクタには、メソッドとは異なる特徴がいくつかあります。
- 宣言要素名とクラス名が同じである
- 戻り値を持たず、途中でのreturnもできない
- インスタンス生成時に1度だけ自動で実行される
一方で、コンストラクタはメソッドと同じように、複数実装 (オーバーロード) することができます。
アクセス装飾子でアクセスレベルをコントロールしたり、例外を投げることも可能です。
コンストラクタの使い方
ここからは、コンストラクタの実際の使い方について説明していきます。
コンストラクタを呼び出す
まず初めに、コンストラクタの基本的な使い方について解説します。
先ほど説明したように、コンストラクタを実装する際はクラス名と同じ名前でメソッドを記述します。
以下のサンプルコードで動きを見てみましょう。
【サンプルコード】
public class Main {
public static void main(String[] args) {
SampleConstructor sampleCS = SampleConstructor();
}
}
class SampleConstructor {
String str;
// コンストラクタ
public SampleConstructor() {
str = "SampleConstructor";
System.out.println(str);
}
}
【実行結果】
SampleConstructor
インスタンスを生成することで、コンストラクタの処理内容が実行されているのが分かると思います。
基本はこのように、クラス名と同じ名前でメソッドを作成し、初期化したい内容を記述します。
なお、そのクラス内にコンストラクタが定義されていない場合には、デフォルトコンストラクタと呼ばれる空のコンストラクタ(public Sum() {})が自動で作成されます。
そのため、コンストラクタの記述は必須ではありません。
引数を指定する(オーバーロード)
コンストラクタには、通常のメソッドと同様に引数を指定することができます。
また、前述したようにオーバーロードで複数のコンストラクタを実装することも可能なため、引数の有無によってインスタンス生成時の動作を使い分けることも可能です。
以下のサンプルコードで動作を見てみましょう。
【サンプルコード】
public class Main {
public static void main(String[] args) {
SampleConstructor sampleCS1 = new SampleConstructor();
SampleConstructor sampleCS2 = new SampleConstructor("SampleOverload");
}
}
class SampleConstructor {
String str = "SampleConstructor";
public SampleConstructor() {
System.out.println(str);
}
public SampleConstructor(String changeStr) {
str = changeStr;
System.out.println(str);
}
}
【実行結果】
SampleConstructor
SampleOverload
オーバーロードとはこのように、引数の型や数が異なる同名のメソッド、 またはコンストラクタを複数記述することを言います。
上記のサンプルコードの結果を見ると分かるように、同じメソッド名でも引数の違いによって処理を分けられるのが特徴です。
オーバーロードで複数のコンストラクタを定義することで、初期化の内容を状況に応じて使い分けることができます。
thisを使用して別のコンストラクタを呼び出す
コンストラクタは複数定義することが可能だと説明しましたが、インスタンス化の際にはいずれか1つしか動作させることができません。
ただし、「this」 という特殊な変数を使用することで、コンストラクタ内から別のコンストラクタを呼び出すことができます。
thisとは、そのクラスのインスタンス自身を表す参照変数のことを言います。
自分のクラスの変数やメソッドにアクセスする際に使用する変数で、コンストラクタの呼び出し以外にも様々な場面で活用することができます。
以下のサンプルコードで実際の動きを見てみましょう。
【サンプルコード】
public class Main {
public static void main(String[] args) {
SampleConstructor sampleCS1 = new SampleConstructor();
SampleConstructor sampleCS2 = new SampleConstructor("SampleThis");
}
}
class SampleConstructor {
String str;
public SampleConstructor() {
this("SampleConstructor");
}
public SampleConstructor(String str) {
this.str = str;
System.out.println(this.str);
}
}
【実行結果】
SampleConstructor
SampleThis
thisを使用して別のコンストラクタを呼び出す際は、コンストラクタ名は記述せずにそのまま thisの後ろに引数に渡す値を記述します。
また、上記のサンプルコードでは、渡された値をフィールド変数に代入する際に、thisを使用して指定する変数が自身のフィールド変数であることを明示しています。
このコードの場合は thisを使用しなくても正常に動作しますが、フィールド変数と引数の変数名が同じ場合などに明示的に記述しておくことで、コードの可読性を高めることができます。
継承したクラスでsuperを使用する
先ほどのサンプルでは、自身のクラス内にある別のコンストラクタを呼び出すために thisを使用しましたが、クラスを継承した際に子クラスから親クラスのコンストラクタを呼び出すこともできます。
継承を行った子クラス内で親クラスの変数やメソッドにアクセスしたい場合は、「super」 を使用します。
以下のサンプルコードを見てみましょう。
【サンプルコード】
public class Main {
public static void main(String[] args) {
SampleSub sub1 = new SampleSub();
SampleSub sub2 = new SampleSub("subClass");
}
}
class SampleConstructor {
String str;
public SampleConstructor() {
this.str = "SampleConstructor";
System.out.println(this.str);
}
public SampleConstructor(String str) {
this.str = str;
System.out.println(this.str);
}
}
class SampleSub extends SampleConstructor {
public SampleSub() {
super();
}
public SampleSub(String str) {
super(str);
}
}
【実行結果】
SampleConstructor
subClass
記述方法は、thisを使用するケースとほとんど同じです。
このように、superを使って親クラス側のコンストラクタを指定することもできます。
メソッドの呼び出しで例外が発生する場合
冒頭でも軽く解説しましたが、通常のメソッドと同様にコンストラクタでも例外を投げることができます。
コンストラクタの記述時に throws で例外を投げるよう指定することで、実行元のクラスで例外をキャッチすることが可能です。
以下のサンプルコードを見てみましょう。
【サンプルコード】
public class Main {
public static void main(String[] args) {
try {
SampleConstructor sampleCS = new SampleConstructor();
} catch(NullPointerException e) {
System.out.println(e);
}
}
}
class SampleConstructor {
String str;
public SampleConstructor() throws NullPointerException {
System.out.println(this.str.length());
}
}
【実行結果】
java.lang.NullPointerException: Cannot invoke "String.length()" because "this.str" is null
上記のサンプルコードでは、SampleConstructorクラスのインスタンス生成時に、意図的に NullPointerExceptionの例外が発生するよう記述しています。
throws で例外を投げることを宣言し、実行元のクラスで try-catch 文を記述して例外をキャッチすることで、エラー発生時にインスタンスの作成を回避することができています。
通常のメソッドと同様に、コンストラクタの実行時にもエラーが発生する可能性は存在するため、必要に応じて例外処理を記述するようにしておきましょう。
まとめ
いかがでしたか?今回は、コンストラクタの使い方について解説しました。
様々なケースで活用される重要な機能ですので、ぜひ覚えて活用してみてくださいね。
Javaの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、Javaに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。