Previous | Next | Trail Map | Writing Java Programs | オブジェクト、クラス、インタフェース


コンストラクタ

コンストラクタはクラスと同一名を持っている。Rectangle クラスのコンストラクタ名は Rectangle() 、 Thread クラスのコンストラクタ名は Thread() である。 Java はメソッド名のオーバーロードをサポートするので、クラスはいくつもの同一名のコンストラクタを持つことができる。 他のオーバーロードメソッドのように、コンストラクタは引数の数と型により区別される。

java.awt パッケージの Rectangle クラスを例に考える。そこでは、いくつかの異なるコンストラクタを提供し、すべてが Rectangle() と指定されている。しかし、それぞれには、新規のRectangle オブジェクトが初期状態を持つ異なる引数の数や型があるとする。 次は、java.awt.Rectangle: class からのコンストラクタシグニチャである。

public Rectangle()
public Rectangle(int width, int height)
public Rectangle(int x, int y, int width, int hieght)
public Rectangle(Dimension size)
public Rectangle(Point location)
public Rectangle(Point location, Dimension size)

最初の Rectangle コンストラクタは、新規の Rectangle を妥当なデフォルトに初期化する。2番目のコンストラクタは指定された幅と高さで新規の Rectangle を初期化する。3番目のコンストラクタは、指定された位置で指定された幅と高さで新規の Rectangle を初期化する。

一般に、コンストラクタは、新規オブジェクトの状態を初期化するために引数を使用する。 これにより、オブジェクトを作成する時は、新規オブジェクトが望む通りに初期化される引数を持つコンストラクタが選択される。

コンストラクタに渡す引数の数と型に基づいて、コンパイラはいずれのコンストラクタを使用するかを判断することができる。 したがって、プログラマが次のように書くと、

new Rectangle(0, 0, 100, 200);

コンパイラは、整数の4つの引数を必要とするコンストラクタを使うと認識する。また、次のように書いた場合、

new Rectangle(myPointObj, myDimensionObj);

1つの Point オブジェクト引数と1つの Dimension オブジェクト引数を必要とするコンストラクタを使うと認識する。

ユーザ独自のクラスを書いている時、それのためにコンストラクタを提供しなくてもよい。 デフォルトのコンストラクタである、引数を取らないコンストラクタは、自動的にすべてのクラスに実行時システムにより提供される。 しかし、しばしばクラスのためにコンストラクタを提供する必要がある。

クラスでの他のメソッドのように、コンストラクタを宣言して実装する。 コンストラクタの名前はクラスの名前と同じでなければならない。複数のコンストラクタを提供する場合は、各コンストラクタへの引数は他のクラスとは異なる数あるいは型でなくてはならない。 コンストラクタのために返り値は指定しない。

下記は Thread のサブクラスの:]ストラクタである。動画を実行し、フレームスピードやイメージの数のようなデフォルト値を設定し、イメージをロードする。

class AnimationThread extends Thread {
    int framesPerSecond;
    int numImages;
    Image images[];

    AnimationThread(int fps, int num) {
        int i;

        super("AnimationThread");
        this.framesPerSecond = fps;
        this.numImages = num;

        this.images = new Image[numImages];
        for (i = 0; i
 <= numImages; i++) { . . . // Load all the images. . . . } } } 
コンストラクタの本体は他のメソッドの本体と全く同じであることを注意する。これにはローカル変数宣言、ループ、他の文が含まれる。 しかし、通常のメソッドでは見られない行(2行目)が AnimationThread コンストラクタにある。
super("AnimationThread");

この行は AnimationThreadのスーパークラス(Thread)が提供するコンストラクタを起動する。 この特定の Thread コンストラクタは、スレッドの名前を設定する String を取る。 しばしばコンストラクタは、クラスの上位で書かれた初期化コードを利用することを望む。 確かに、若干のクラスではオブジェクトが正確に働くために、それらのスーパークラスコンストラクタを呼び出さなくてはならない。 一般に、スーパークラスコンストラクタは、サブクラスのコンストラクタの中で一番最初に起動される。オブジェクトは最初に高いレベルの初期化を実行するべきである。

クラスのコンストラクタを宣言する時、他のオブジェクトがクラスのインスタンスを作成することができることを明示するために、標準的なアクセス指示子を使用することができる。

private
他のどのようなクラスもオブジェクトとしてクラスをインスタンス化することができない。 クラスはまだ public クラスメソッドを含むことができ、それらのメソッドはオブジェクトを作成して返すことができるが、しかし他に誰もこれを行うことはできない。
protected
クラスのサブクラスだけがそのインスタンスを作成することができる。
public
誰でもクラスのインスタンスを作成することができる。
「Friendly」
パッケージ外ではクラスのインスタンスを作成することができない。 パッケージ内のクラスにこのクラスのインスタンスを作成させ、しかし他の誰でもこれをさせたくない場合、、これは実用的である。


Previous | Next | Trail Map | Writing Java Programs | オブジェクト、クラス、インタフェース