Java
2022.06.10
コンストラクタとは?使い方をサンプルコード付きで解説【Java】
2023.11.18

Javaプログラミング学習をするうえで、「コンストラクタとは?」と悩んでいる方も多いのではないでしょうか?


「コンストラクタの基本的な使い方は?」

「継承したクラスでコンストラクタを呼び出す方法は?」


といった疑問に対して、本記事ではコンストラクタについて初心者エンジニア向けに詳しく解説していきます。


※本記事で紹介するサンプルコードは、Java18で動作確認しています。


1.コンストラクタとは?

コンストラクタとは、クラスのインスタンス生成時に実行される処理のことです。コンストラクタ名はクラス名と同じ名前となり、戻り値のないメソッドとなっています。

①コンストラクタの役割

コンストラクタは、クラスのインスタンス生成時に実行されます。コンストラクタを使用すると、変数を初期化できるので、最初に変数を定義しておくことができます。


初期化用のメソッドを作る必要がなくなるので、コードの簡素化が図れるのです。

②コンストラクタが使われる言語

C++、C#、Java、PHP、Pythonなどのオブジェクト指向言語で、コンストラクタが使われています。



2.コンストラクタの基本的な使い方


コンストラクタはさまざまな言語で使われていますが、ここからはJavaを例にして使い方を紹介します。

①コンストラクタの基本ルール

コンストラクタの基本ルールには次の2点があります。


・コンストラクタ名とクラス名を同一にする

・戻り値を記述しない


基本ルールを踏まえたうえで、Javaでのコンストラクタの記述方法を見てみましょう。

class Configurator {
    Configurator(){
        //インスタンス生成する時に行う処理
    }
}

②コンストラクタを定義し、呼び出す

コンストラクタの基本ルールを理解したところで、コンストラクタを呼び出す方法を見てみましょう。

以下は、インスタンスを生成し、コンストラクタを呼び出すサンプルコードです。

public class App {

    public static void main(String[] args) {
        //インスタンス生成
        Configurator cp = new Configurator();
    }
}
class Configurator {
    String message = "Hello world!!";
    Configurator(){
        System.out.println(message);
    }
}

実行結果:

Hello world!!

サンプルコードでは、mainメソッドからConfiguratorクラスのインスタンスを生成しています。その際にコンストラクタConfiguratorが呼び出されています。



3.コンストラクタの複数定義(オーバーロード)


コンストラクタでも通常のメソッドと同様に、引数の数や型が異なるのであれば、複数のコンストラクタを定義できます。

public class App {
    public static void main(String[] args) {
        //インスタンス生成
        Computer cp = new Computer("TRAINOCAMP");
    }
}

class Computer {
    Computer(){
        System.out.println("コンピュータ名はデフォルトです");
    }

    Computer(String pcname){
        System.out.println("コンピュータ名は" + pcname + "です。");
    }
}

実行結果:

コンピュータ名はTRAINOCAMPです。

①thisで自分自身のコンストラクタを呼び出す

コンストラクタから、自分自身がもつ他のコンストラクタを呼び出すことも可能です。thisを使って「this(引数)」の形式で呼び出します。

public class App {
    public static void main(String[] args) {
        //インスタンス生成
        Computer cp = new Computer();
    }
}

class Computer {
    Computer(){
        this(256);
    }

    Computer(int storage){
        System.out.println("コンピュータのストレージは" + storage + "GBです");
    }
}

実行結果:

コンピュータのストレージは256GBです




4.コンストラクタでメンバ変数を初期化してみよう


コンストラクタを利用してメンバ変数を初期化する方法について解説します。

①引数ありのコンストラクタを定義

引数ありのコンストラクタを利用してメンバ変数を初期化できます。インスタンス化する際に、初期化に必要な値を引数で渡しましょう。その引数をメンバ変数にセットすると初期化できます。

public class App {
    public static void main(String[] args) {
        //インスタンス生成
        Computer cp = new Computer("note",128);
        cp.dispSpec();
    }
}

class Computer {
    String type;
    int storage;

    Computer(String pctype,int storagesize){
        type = pctype;
        storage = storagesize;
    }

    public void dispSpec(){
        System.out.println("コンピュータのタイプは" + type + "です");
        System.out.println("コンピュータのストレージは" + storage + "GBです");
    }
}

実行結果:

コンピュータのタイプはnoteです
コンピュータのストレージは128GBです

②引数で渡した値をthisで受け取る

コンストラクタの引数で渡した値を、this句を使って受け取ります。コンストラクタの引数の変数名か、クラスのメンバ変数かを区別するときにthis句を使用します。

public class App {
    public static void main(String[] args) {
        //インスタンス生成
        Computer cp = new Computer("server",512);
        cp.dispSpec();
    }
}

class Computer {
    String type;
    int storage;

    Computer(String type,int storage){
        this.type = type;
        this.storage = storage;
    }

    public void dispSpec(){
        System.out.println("コンピュータのタイプは" + type + "です");
        System.out.println("コンピュータのストレージは" + storage + "GBです");
    }
}

実行結果:

コンピュータのタイプはserverです
コンピュータのストレージは512GBです




5.継承したクラスでコンストラクタを呼び出す方法

Javaでは、スーパークラスのコンストラクタを呼び出せます。その方法について解説します。

①コンストラクタは継承されない

コンストラクタは通常のメソッドと異なり、継承することはできません。

次のサンプルコードではエラーになります。

public class App {
    public static void main(String[] args) {
        //インスタンス生成
        Computer cp = new Computer();
        cp.dispSpec();
    }
}

class Computer {
    String type;
    int storage;

    Computer(){
        this.type = "desktop";
        this.storage = 128;
    }

    public void dispSpec(){
        System.out.println("コンピュータのタイプは" + type + "です");
        System.out.println("コンピュータのストレージは" + storage + "GBです");
    }
}

class Tablet extends Computer{
    String display;
    Tablet(){
        Computer();
    }
}

エラーメッセージ:

The method Computer() is undefined for the type Tablet

②superでスーパークラスのコンストラクタを呼び出す

サブクラスからスーパークラスのコンストラクタを呼び出すには、superを使います。

サンプルコードで確認してみましょう。

public class App {
    public static void main(String[] args) {
        //インスタンス生成
        Tablet tb = new Tablet();
        tb.dispSpec();
    }
}

class Computer {
    String type;
    int storage;

    Computer(){
        this.type = "desktop";
        this.storage = 128;
    }
    Computer(String type,int storage){
        this.type = type;
        this.storage = storage;
    }
    public void dispSpec(){
        System.out.println("コンピュータのタイプは" + type + "です");
        System.out.println("コンピュータのストレージは" + storage + "GBです");
    }
}

class Tablet extends Computer{
    String display;
    Tablet(){
        super("tablet",64);
    }
}

実行結果:

コンピュータのタイプはtabletです
コンピュータのストレージは64GBです




6.デストラクタとは?


デストラクタとは、オブジェクト指向言語の用語です。


コンストラクタがインスタンス生成時に実行される処理に対し、デストラクタはインスタンスが破棄されるタイミングで実行される処理です。

コンストラクタとセットで覚えておきましょう。

①Javaにはデストラクタの概念がない

しかしながら、Javaにはデストラクタの概念がありません。その理由のひとつとして、ガベージコレクション機能が挙げられます。


ガベージコレクション機能は、プログラム内で使用しなくなったオブジェクトを自動で消去する仕組みです。ガベージコレクションがあることにより、プログラマーがメモリ管理をする必要がありません。


Javaではメモリ空間を行う必要がないとの設計思想があり、これがデストラクタが提供されていない要因と考えられます。


この記事をシェア