Javaの「コンストラクタ」について

こんにちは。ゆうせいです。

Javaのプログラムでオブジェクトを作成する際に必ず出てくる「コンストラクタ」というものについて、今回は詳しく解説しますね。コンストラクタは、Javaのクラスを理解し、オブジェクト指向のプログラミングをしっかりと身につけるために欠かせないものです。

それでは早速、コンストラクタの役割や使い方について見ていきましょう!


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

コンストラクタとは、オブジェクトが作成される際に初期化処理を行うための特殊なメソッドのことです。クラスからインスタンス(実体)を作るときに必ず呼び出され、フィールドの初期化やオブジェクトの設定などを行います。

たとえば、クラスを「設計図」と考えた場合、コンストラクタはその設計図に基づいて新しいオブジェクトを作るときの「組み立て作業」に当たります。


2. コンストラクタの特徴

コンストラクタには、以下のような特徴があります。

  • クラス名と同じ名前で定義される:クラス名がCarなら、コンストラクタもCarという名前になります。
  • 戻り値がない:メソッドとは異なり、戻り値を指定しません(voidも書かない)。
  • newキーワードでオブジェクトを生成する際に自動的に呼び出される:オブジェクトを作るときには必ず呼ばれます。

例:コンストラクタの定義

以下は簡単なCarクラスとそのコンストラクタの例です。

public class Car {
    String model;
    int year;

    // コンストラクタ
    public Car(String model, int year) {
        this.model = model;
        this.year = year;
    }
}

このCarクラスでは、Carというコンストラクタが定義されています。このコンストラクタには、車のモデルと製造年(modelyear)を設定するための引数があり、this.model = model;のようにしてフィールドに値を設定しています。


3. コンストラクタの主な役割

3.1 フィールドの初期化

コンストラクタの最も重要な役割は、クラスのフィールドに初期値を設定することです。オブジェクトを生成する際に、必要な情報や設定をまとめて行うことで、すぐに使用できる状態にしてくれます。

例えば、次のようにCarクラスのオブジェクトを生成すると、指定したmodelyearの値を持ったCarオブジェクトが得られます。

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car("Toyota", 2022); // "Toyota"と2022で初期化
        System.out.println(myCar.model); // 結果: Toyota
        System.out.println(myCar.year);  // 結果: 2022
    }
}

3.2 必要な初期化の強制

コンストラクタを使うことで、オブジェクトが使える状態になるために必要な情報を必ず渡すように強制することができます。例えば、車を作る際には「モデル名」と「製造年」が必須であるなら、引数を持つコンストラクタを用意しておくことで、誤って初期化されていないCarオブジェクトができるのを防げます。

3.3 デフォルトコンストラクタ

Javaでは、コンストラクタを特に指定しない場合、自動的にデフォルトコンストラクタ(引数なしコンストラクタ)が用意されます。このデフォルトコンストラクタは、引数を取らず、フィールドは型のデフォルト値で初期化されます(例えば、int型なら0String型ならnull)。

例:デフォルトコンストラクタが作成される場合

public class Bike {
    String color;
    int speed;
}

public class Main {
    public static void main(String[] args) {
        Bike myBike = new Bike(); // デフォルトコンストラクタで初期化
        System.out.println(myBike.color); // 結果: null
        System.out.println(myBike.speed); // 結果: 0
    }
}

もし自分でコンストラクタを定義した場合、デフォルトコンストラクタは自動的に作成されないので、必要ならば明示的に引数なしのコンストラクタを追加する必要があります。


4. コンストラクタのオーバーロード

コンストラクタはオーバーロードが可能です。つまり、異なる引数の組み合わせで複数のコンストラクタを作成できます。これにより、オブジェクトの生成方法に柔軟性を持たせることができます。

public class Laptop {
    String brand;
    int memory;

    // メモリ容量を指定するコンストラクタ
    public Laptop(String brand, int memory) {
        this.brand = brand;
        this.memory = memory;
    }

    // ブランドのみを指定するコンストラクタ
    public Laptop(String brand) {
        this(brand, 8); // デフォルトのメモリ8GBを指定
    }
}

この例では、Laptopクラスに2つのコンストラクタがあり、1つはブランドとメモリを指定し、もう1つはブランドのみを指定するコンストラクタです。ブランドだけを指定してオブジェクトを作成すると、メモリがデフォルトで8GBに設定されます。


5. コンストラクタとメソッドの違い

コンストラクタと通常のメソッドは似ていますが、以下のような違いがあります。

コンストラクタメソッド
クラス名と同じ名前で定義する任意の名前がつけられる
戻り値がない(voidも書かない)戻り値が必要(voidも含む)
オブジェクト生成時に呼ばれるオブジェクト生成後に呼ばれる

まとめ

  • コンストラクタはオブジェクトの初期化に使われる特殊なメソッド:クラス名と同じ名前で定義し、戻り値はない。
  • フィールドの初期化やオブジェクト設定のために使用される:オブジェクトの生成時に必要な情報を渡せる。
  • デフォルトコンストラクタとオーバーロードの利用:コンストラクタを指定しない場合、引数なしのデフォルトコンストラクタが自動で生成される。
  • オーバーロードで柔軟な初期化が可能:異なる引数のコンストラクタを複数定義することで、様々な初期化方法を用意できる。

コンストラクタの役割を理解すると、オブジェクトの生成と初期化がよりスムーズに行えるようになります。オーバーロードやデフォルトコンストラクタの活用も視野に入れつつ、コードを書いてみてください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。