Javaのコンストラクタとは?書き方や使い方をわかりやすく解説!

Javaのコンストラクタとは何ですか?いつ使うの?書き方や使い方をわかりやすく解説してほしい。
こんなお悩みにお答えします。
この記事を読めば、Javaのコンストラクタの基本を押さえることができますよ。

実際に僕は現役エンジニアで、主にJavaを扱っておりますので、初心者にもわかりやすく解説しますね。
コンストラクタとは「クラスをインスタンス化する際に実行される処理」のことです。現場ではよく使われますので、ぜひ最後までご覧いただき、理解を深めてみてください。

Javaのコンストラクタの基本概要
まずはコンストラクタの基本を解説していきます。
- コンストラクタとは
- コンストラクタの書き方
- コンストラクタの特徴
コンストラクタとは
コンストラクタとは、クラスのインスタンスを作る時に実行される処理のことです。
コンストラクタは英語で「constructor」で、翻訳すると「建設者」です。ちなみにインスタンスとは「実体」という意味です。
コンストラクタは各クラスに必ず存在しています。
コンストラクタの書き方
コンストラクタは下記の様に記述します。
class クラス名 {
コンストラクタ名(){
}
}
コンストラクタ名はクラス名と同じにしつつ、戻り値はありません。それを踏まえた上で書いてみます。
class Test1{
Test1(){
}
}
上記の通りです。通常のメソッドと書き方は似ていますが、コンストラクタには戻り値がありません。
アクセス修飾子は制限がないため、publicやprivateなど自由につけられます。
class Test1{
public Test1(){
}
}
コンストラクタの特徴
コンストラクタの特徴は以下の通り。
- 戻り値を持たない
- returnもない
- アクセス修飾子に制限はない
- インスタンス化(new)する際に実行される
- クラス名と同じ名前
- インスタンスが持つフィールドに値を設定する際に使われることが多い
コンストラクタはなぜ必要か
「なぜコンストラクタは必要なのか?」と疑問を感じた方もいると思います。
コンストラクタはクラスを実体化するために必要です。メンバ変数を初期化するためにも必要です。
たとえばコンストラクタがないと、クラスを実体化できません。つまり他のクラスの機能が使えないというわけです。
プログラミングでは同じ様な処理を何度も行う場面があり、1つ共通のクラスを作っておけば、使い回せます。無駄な記述をしなくて済むのです。
コンストラクタがあれば他クラスをインスタンス化(実体化)でき、そのクラスで定義しているメソッドや変数を使えるようになるのです。
Javaではコンストラクタが必須です。

Javaのコンストラクタの使い方【基本】
コンストラクタを実際に使う方法をご紹介します。
- newを使って呼び出す
- 引数がある時とない時
- デフォルトコンストラクタ
- コンストラクタを作らない
- 初期化子が先に実行される
順番に見ていきましょう。
new演算子でインスタンス化する
コンストラクタを呼び出すにはnew演算子を使います。new演算子とは、クラスをインスタンス化する時に使われる演算子のことです。
基本的な書き方は以下の通り。
new コンストラクタ名;
コンストラクタはクラスの中で定義します。実際に呼び出してみましょう。
class Test1 {
public static void main(String[] args) {
new Test2();
}
}
class Test2 {
Test2(){
}
}
上記の通り。コンストラクタを呼び出す時は、newを使いましょう。ちなみにJavaエンジニアの間では、newを使ってインスタンス化することを「newする」などと言います。
あわせて覚えておくと良いですね。
インスタンス変数を使う
new演算子を使えばインスタンス化できますが、引数がなければただ実体化されるだけで、特に何も起こりません。
そこで「インスタンス変数」を使うことで、値を代入したり、インスタンス化したクラスのメソッドを呼び出したりできます。
例を見てみましょう。
まずはインスタンス変数への代入方法です。
クラス名 インスタンス変数名 = new コンストラクタ名;
newでインスタンス化したものを、同じクラス名を型として定義し、変数名を記述します。
class Test1 {
public static void main(String[] args) {
Test2 ins = new Test2();
ins.test3(30);
}
}
class Test2 {
Test2(){
}
public static void test3(int num){
System.out.println(num);
}
}
上記を解説しますと、まずnewでTest2クラスをインスタンス化し、インスタンス変数「ins」に代入します。この時点でTest2クラスのtest3メソッドを呼び出せます。
Test2クラスのtest3メソッドを呼び出すには、インスタンス変数.メソッド名で呼び出せますね。ins.test3();です。
引数がある時
コンストラクタは引数がある時があります。引数はnewでインスタンス化する時に渡せます。
class Test1 {
public static void main(String[] args) {
new Test2(2, 1);
}
}
class Test2 {
Test2(int num1, int num2){
System.out.println(num1 + num2);
}
}
上記を解説しますと、new Test2(2,1):でTest2クラスのTest2メソッドの引数num1に2とnum2に1を渡しています。そしてnum1とnum2を足した値を出力しています。
コンストラクタはnewする時に実行されます。
実行結果:
3
デフォルトコンストラクタについて
コンストラクタは必須というのは分かったとして、コンストラクタを記述しなかった場合はどうなるのでしょうか?
コンストラクタを記述しなかった場合、目に見えないだけで自動的に作成されているのです。
たとえば下記はコンストラクタを記述していません。
class Test1 {
public static void main(String[] args) {
new Test2();
}
}
class Test2 {
}
しかし実際にコンパイルは通りエラーは発生しません。それにnewでインスタンス化もできます。
目に見えないだけで以下の様にコンストラクタは裏で自動作成されているのです。
class Test1 {
public static void main(String[] args) {
new Test2();
}
}
class Test2 {
Test2(){
}
}
これをデフォルトコンストラクタと言います。
デフォルトコンストラクタは明示的にコンストラクタを記述した場合は作成されません。
初期化子が先に実行される
初期化子とは、コンストラクタが実行される前に実行されるものです。
コンストラクタはオーバーロードによって、複数記述できます。オーバーロードの解説は後述しますね。
初期化子に処理を書いておくことで、複数のコンストラクタが実行される前に、共通で処理を行えます。
初期化子は以下のように記述します。
{
// 初期化子の処理
}
ではサンプルコードを見てみましょう。
public class Sample {
public static void main(String[] args) {
new Item();
new Item("コンストラクタ2");
}
}
public class Item {
public Item() {
System.out.println("コンストラクタ");
}
public Item(String str){
System.out.println(str);
}
{
System.out.println("初期化子");
}
}
出力結果:
初期化子
コンストラクタ
初期化子
コンストラクタ2
コンストラクタの使い方【応用】
もう少しコンストラクタの使い方を覚えていきましょう。
- コンストラクタのオーバーロード
- スーパークラスのコンストラクタの呼び出し方
コンストラクタのオーバーロード
コンストラクタはオーバーロードして使えます。
オーバーロードとは、引数の型や引数の数を変えることで、同じメソッド名を使えるようになる処理のことです。
たとえば、コンストラクタをオーバーロードするには、以下の様に記述します。
class Test1 {
public static void main(String[] args) {
new Test2();
new Test2(1);
new Test2("呼び出し");
}
}
class Test2 {
Test2(){
}
Test2(int num){
System.out.println(num);
}
Test2(String str){
System.out.println(str);
}
}
スーパークラスのコンストラクタの呼び出し方
Javaはクラスの継承が可能です。継承することで、親クラスのメソッドを子クラスで使用できます。親クラスのことを、スーパークラスと言います。
スーパークラスのコンストラクタは「super();」と記述すれば呼び出せます。具体例をあげてみますね。
class Test1{
public static void main(String args[]){
Test3 sample = new Test3();
}
}
class Test2{
Test2(){
System.out.println("Test2のコンストラクタ");
}
}
class Test3 extends Test2{
Test3(){
super();
System.out.println("Test3のコンストラクタ");
}
}
Test3クラスでTest2を継承しています。ここでいうスーパークラス(親クラス)は、Test2です。Test2のコンストラクタを呼び出すには、super();とすれば呼び出せます。
実行結果:
Test2のコンストラクタ
Test3のコンストラクタ
Javaのコンストラクタ:まとめ
Javaのコンストラクタについて解説しました。
コンストラクタはJavaでは必須の処理なので、ぜひ覚えてみてくださいね。
以下ではJavaエンジニアの学習ロードマップを解説していますので、あわせて読んでみてください。
