コンストラクタの記述

オブジェクトを作るには,「new クラス名()」とすれば良いが,オブジェク トを作る際に,要素の初期値を設定したりなど付随する操作をおこないたいこ とがある.これまでの例では,Point2D型のオブジェクトを作るたびに,イン スタンス変数 x, y を設定していた.これを初期化のためのメソッド initialize を作って実現してみると,
class Point2D {
  public double x,y;
    // Point2Dのインスタンス変数を初期化するための動的メソッド
  public void initialize(double xx,double yy){
    this.x=xx; this.y=yy;
  }
  public double length(){
    return Math.sqrt(x*x+y*y);
  }
  public double distance2D(Point2D point2){
    double dx=(x-point2.x),dy=(y-point2.y);
    return Math.sqrt(dx*dx+dy*dy);
  }
}

class ObjectTest5 {
  public static void main(String[] args){
    Point2D p1,p2,p3;
      // Point2Dクラスのインスタンスを作成する
    p1=new Point2D();
      // インスタンス変数の中身を初期化する。
    p1.initialize(0.0,0.0);
    p2=new Point2D();
    p2.initialize(1.0,1.0);
    p3=new Point2D();
    p3.initialize(0.0,1.0);
    System.out.println("length of p1 = "+p1.length());
    System.out.println("length of p2 = "+p2.length());
    System.out.println("length of p3 = "+p3.length());
    System.out.println("distance between p1 and p2 "+p1.distance2D(p2));
    System.out.println("distance between p2 and p3 "+p2.distance2D(p3));
    System.out.println("distance between p3 and p1 "+p3.distance2D(p1));
  }
}
となる.このようにオブジェクトの作成と初期化のためのメソッド呼び出しは, 連携しておこなわれることが多い.

そのため,クラスの定義中にコンストラクタ(constructor,構築子と訳される こともある)と呼ばれる特別なメソッドを作っておいて,「new クラス名(引数 1, .. , 引数n)」としてオブジェクトを作ると引数の型が合うコンストラクタ が呼ばれるようにできる.コンストラクタは通常のメソッドのように,返り値 を持たない(void 型の返り値を持つとも言えるが,void とは書かない)

コンストラクタを使って,書き直したのが以下のプログラムである(コンスト ラクタの中での「this.」は省略して書いた.省略しないで書いても問題ない).

class Point2D {
  public double x,y;
    // Point2Dクラスのコンストラクタ((double,double)型の引数を持つ場合)の宣言
  public Point2D(double xx,double yy){
    x=xx; y=yy;
  }
  public double length(){
    return Math.sqrt(x*x+y*y);
  }
  public double distance2D(Point2D point2){
    double dx=(x-point2.x),dy=(y-point2.y);
    return Math.sqrt(dx*dx+dy*dy);
  }
}

class ObjectTest5 {
  public static void main(String[] args){
    Point2D p1,p2,p3;
      // Point2Dクラスのインスタンスをコンストラクタを呼び出して作成する。
    p1=new Point2D(0.0,0.0);
    p2=new Point2D(1.0,1.0);
    p3=new Point2D(0.0,1.0);
    System.out.println("length of p1 = "+p1.length());
    System.out.println("length of p2 = "+p2.length());
    System.out.println("length of p3 = "+p3.length());
    System.out.println("distance between p1 and p2 "+p1.distance2D(p2));
    System.out.println("distance between p2 and p3 "+p2.distance2D(p3));
    System.out.println("distance between p3 and p1 "+p3.distance2D(p1));
  }
}
オブジェクトが作られる際に呼ばれるコンストラクタ(constructor)に対応す るものとして,オブジェクトが不要になって捨てられる際に呼ばれるファイナ ライザ(finalizer,C++などではデストラクタ(destructor)と言われるもの) があるが,それほど出てこない.

次へ進む