3-2: オブジェクトの生成とコンストラクタ


・ 次に新しいオブジェクトを生成する具体的な方法を説明しましょう。 Javaでは通常の場合、オブジェクトの生成は、 コンストラクタ(constructor)というものの呼び出しによって実現します。 JDKのクラスライブラリに用意されたクラスの多くは、 それぞれのコンストラクタを呼び出すことで、 自由にオブジェクトを生成することができます。


Fram frame = new Frame( "Color Frame Test" );
Color color = new Color( 255, 0, 255 );

コンストラクタの呼び出しで通常のメソッドと異なっている点は、 コンストラクタの前に必ず "new" というキーワードが付く点です。 ここでは java.awtパッケージに用意された Frame 及び Colorクラスの オブジェクトが生成されています。 Frameは画面に表示される独立したウィンドウを表すクラスです。 Colorは色の情報を表すクラスです。 「new + クラス名で決まるコンストラクタ」というルールは、 すべてのクラスに対して共通しています。 ただしコンストラクタの引数としてどんな型のデータを何個与えることができるかは、 クラスによって異なります。 (ここでは天下り的に既にわかっているものとして利用しました。 本来ならクラスの定義にさかのぼって、 どんなコンストラクタが定義されているかを調べることになります。) Frameのコンストラクタの引数として与えられた文字列のデータは、 ウィンドウが表示された時のタイトルバーのタイトルとなります。 Colorのコンストラクタに与えられた3個の int型のデータは、 順に RGBの3原色の値(0-255の範囲)です。

・ コンストラクタ自身は、それぞれのクラスの内部に定義され、 オブジェクトの初期化の手続きを与えます。 今度は、その部分から独自に定義してみましょう。


/** 背景色を指定してフレームを生成するクラス */
import java.awt.*;
public class ColorFrame {

   /** フレームの情報を記憶するフィールド */
     private Frame frame;

   /** コンストラクタ(デフォルトの背景色をそのまま利用) */
     public ColorFrame() {
          frame = new Frame( "Color Frame" );   //フレームのオブジェクトの生成
          frame.setSize( 400, 300 );            //フレームのサイズの設定
          frame.show();                         //フレームの表示
     }

   /** コンストラクタ(指定された色を背景色に設定) */
     public ColorFrame( Color color ) {
          this();                               //デフォルトのコンストラクタ
          frame.setBackground( color );         //指定された色を背景色に設定
     }
}

Javaでのコンストラクタの取り扱いは、 通常のメソッドとほんとんど同じです。 コンストラクタの定義はもちろんクラスの定義の内部に記述されます。 コンストラクタが通常のメソッドと異なるのは、 その名称が必ずクラス名と同一になるという点です。 これは同時にコンストラクタの型でもあります。 当然のことながらコンストラクタが返す値はそのクラスのオブジェクトです。 したがって void や int のような別の型になることはあり得ません。
また Javaでは複数のコンストラクタを定義することができます。 Javaのメソッドやコンストラクタは名称が同一でも、 返値の型や引数の個数および型が一部でも異なっていれば、 すべて別の存在と見なされるからです。 ここのサンプルでも引数に Colorのオブジェクトを与える場合と、 引数を省略した場合の2種類のコンストラクタが用意されていることがわかります。 また2番目のコンストラクタは、少し不思議なことをしています。 this はクラス自身を指すキーワードですが、 this() はクラス自身のコンストラクタを呼び出す時に用いられます。 つまり2番目のコンストラクタは、 もう1つのコンストラクタを呼び出しているわけです。
なお Frameクラスに定義されたメソッドがいきなり用いられていますが、 それらの働きは容易に理解できるものばかりでしょう。 setSize()はサイズの設定、show()は表示の実行、 setBackground()は背景色の設定を行います。

・ さらに、上で定義したコンストラクタを別のクラスの中で呼び出してみましょう。 ColorFrameクラスのコンストラクタには引数の与え方を2パターン用意しましたから、 ここではその両者を確認のため呼び出してみます。


/** ColorFrameのオブジェクトの生成を確認するクラス */
import java.awt.*;
public class ColorFrameTest {

   /** 最初に起動されるメソッド */
     public static void main( String argv[] ) {
          ColorFrame cf1 = new ColorFrame();
          ColorFrame cf2 = new ColorFrame( new Color( 0, 0, 255 ) );
     }
}

Javaではローカル変数の宣言は必要になった場所で自由に行えます。 また、生成されたオブジェクトに変数名をつけずに生成し、 そのまま使用することもできます。 したがって下記の3つの表現はすべて同じ意味です。


Color color;
color = new Color( 0, 0, 255 );
new ColorFrame( color );

Color color = new Color( 0, 0, 255 );
new ColorFrame( color );

new ColorFrame( new Color( 0, 0, 255 ) );

・ Javaではクラスの定義内で、 自分自身のコンストラクタを呼び出すことも許されています。 上のサンプルでは ColorFrame のクラスを生成するために、 ColorFrameTest という別のクラスを新たに定義しました。 しかし、 実は ColorFrameTestの中の main()メソッドの内容をそっくりそのまま ColorFrameクラス自身の内部に記述してもよかったのです。
最初のうちは奇妙に見えるかもしれませんが、 Javaではこのような記述方法はごく普通に用いられます。