【Java入門】コンストラクタとは?基本から使い方【まとめ】

2021年12月16日

シン

フリーランスエンジニア【経歴】新卒で配送業▶︎販売員▶︎プログラミングスクール卒業▶︎会社員プログラマー1.5年▶︎独立|保有資格:Oracle認定Java Silver|サイトのテーマ:市場価値の高いITエンジニアを輩出する|大阪在住29歳

本記事の内容

  • Javaのコンストラクタの基本概要
  • コンストラクタの使い方【基本】
  • コンストラクタの使い方【応用】

プログラミング言語の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では必須の処理となりますので、ぜひ覚えてみてくださいね。

今回は以上です。