Java入門17 コンストラクタでデータを初期化する

Java入門の第17回です。前回からの続きですが、今回だけでも分かる内容になっています。このシリーズの第1回はこちらです。

今回は、コンストラクタについて解説します。コストラクタは クラス内に配置してデータの初期化などに利用する特別なメソッドです。

コンストラクタとは

コンストラクタとは、newキーワードを使ってインスタンスが生成されるときに、自動的に実行されるメソッドです。クラス内に配置されるメソッドのなかでも、コンストラクタはデータを初期化するなどの特別な役割を果たします。

コンストラクタは、クラス名と同じ名前のメソッド名にすることで作成されます。コンストラクタには引数を渡すことはできますが、コンストラクタから戻り値を返すことはできません。

コンストラクタを使う実例

実例で確認しましょう。以下のコードでは、Pointクラスの中に、Point()というクラス名と同じ名前をつけたコンストラクタがあります。

class Point {
    int x;
    int y;

    //コンストラクタ
    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    //インスタンスメソッド
    void printZahyo() {
        System.out.println(this.x + "," + this.y);
    }
}

public class Test20 {
    public static void main(String[] args) {
        //配列を用意する
        Point[] zahyos = new Point[3];
        //インスタンスを生成
        zahyos[0] = new Point(3, 5);
        zahyos[1] = new Point(5, 7);
        zahyos[2] = new Point(7, 9);
        //インスタンスメソッドを呼び出す
        zahyos[0].printZahyo();
        zahyos[1].printZahyo();
        zahyos[2].printZahyo();
    }
}

上記コードでは、3つの座標を配列に入れています。配列には、生成した3つのインスタンスを配列要素として代入しています。それぞれのインスタンスを生成する際には、引数として2つの整数をPointクラスに渡しています。そして、Pointクラス側では受け取った引数をコンストラクタでxとyに代入して初期化しています。

インスタンスを生成する度に毎回同じように必要となるインスタンス変数への値の代入を、Pointクラスのコンストラクタに任せています。コンストラクタを用意することで、インスタンス生成後にいちいち呼び出し側でインスタンス変数への値の代入をしなくてもよくなっています。

以下は、上記コードをEclipseで実行した結果画面です。

コンストラクタが無い場合

仮に、上記コードと同じ内容をコンストラクタを使わないで実現する場合を考えてみましょう。以下のコードは、上記コードの内容をコンストラクタ無しで書いてみたものです。

class Point {
    int x;
    int y;

    //インスタンスメソッド
    void printZahyo() {
        System.out.println(this.x + "," + this.y);
    }
}

public class Test20 {
    public static void main(String[] args) {
    	//配列を用意する
    	Point[] zahyos = new Point[3];
        //インスタンスを生成
        zahyos[0] = new Point();
        zahyos[1] = new Point();
        zahyos[2] = new Point();
        //インスタンス変数への値の代入
        zahyos[0].x = 3;  zahyos[0].y = 5;
        zahyos[1].x = 5;  zahyos[1].y = 7;
        zahyos[2].x = 7;  zahyos[2].y = 9;
        //インスタンスメソッドを呼び出す
        zahyos[0].printZahyo();
        zahyos[1].printZahyo();
        zahyos[2].printZahyo();
    }
}

上記コードのPointクラスにはコンストラクタがありません。そのため、インスタンスを生成した後に、呼び出し側であらためてインスタンス変数への値の代入を行っています。

上記コードの場合には、インスタンス変数はxとyだけであり、配列要素の個数も3つだけなので、それほど大きな違いを感じないかもしれません。

しかし、コンストラクタが無いと、いちいち呼び出し側でインスタンス変数へ値代入をしなくてはなりません。変数や配列の数が増えると、コードが長くなってコード全体の見晴らしが悪くなります。

まとめ

  • コストラクタとは、クラス内に配置してデータの初期化などに利用する特別なメソッドです。
  • コンストラクタを作成するには、クラス名と同じ名前のメソッドとしてクラス内に配置します。
  • 例えば、Pointクラスのコンストラクタは、Point()という名前のメソッドとして作成します。
  • コンストラクタは、newキーワードを使ってインスタンスが生成されるときに、自動的に実行されます。
  • インスタンス生成の際にコンストラクタに引数を渡すことで、コンストラクタに変数への値の代入や初期化などを任せることができます。
  • コンストラクタには、戻り値はありません。

次回へ続きます。