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


オブジェクトの使用

オブジェクトを作成したら、おそらく何かのためにそれを使用したくなる。 例えば、新規の Rectangle を作成した後で、異なった位置にそれを動かしたいと仮定する(矩形(Rectangle)はドローイングプログラムのオブジェクトで、ユーザは矩形の上でマウスをクリックすると、新しい位置にそれをドラッグできる)。

Rectangle クラスは矩形を移動する 2 つの方法を提供する。

  1. 直接オブジェクトの x 変数を操作する
  2. move() メソッドを呼び出す


変数とともに直接いじるよりも、メソッドの保護レイヤを通して間接的にオブジェクトの変数を操作するので、2番目のオプションはしばしば「よりオブジェクト指向的で」より安全であると考えられる。 直接オブジェクトの変数を操作することは、しばしばエラーのきっかけになると考えられる。オブジェクトを潜在的に矛盾した状態にすることがある。 しかし、オブジェクトを操作して矛盾した状態にすることができるなら、クラスは他のオブジェクトによって直接操作できる変数をもたない(もつべきではない)。 Java では、他の型のオブジェクトによる変数やメソッドのアクセスクラスが限定できたり、可能にできるメカニズムを提供する。 この節では、他のクラスにアクセス可能なメソッドの呼び出しと変数の操作について説明する。 メンバへのアクセス制御について学習するには、クラスのメンバへのアクセスの制御を参照のこと。

Rectangle の x はすべての他のクラスにアクセス可能である。 そこで Rectangle の変数 x を直接操作することは、安全であると仮定することができる。

オブジェクトの変数の参照

最初に、変数 x を直接変更して、Rectangle の位置を調べたり変更する方法に注目する。 次の節では、その move() メソッドを呼び出して矩形を移動する方法を示す。

オブジェクトの変数にアクセスするには、オブジェクト参照の後にピリオド(.)を付けて変数名を追加する。

objectReference.variable 

プログラムで矩形が rect と指定されると仮定する。 それぞれ rect.x rect.y で変数 x にアクセスすることができる。 rect の変数名があるので、通常の変数名としてJava の文と式でそれらを使用することができる。 したがって矩形を移動するために、新しい位置を書く。

rect.x = 15;        // change x position
rect.y = 37;        // change y position

Rectangle クラスは、Rectangle の外にあるオブジェクトにアクセス可能なwidthheightの 2 つの変数を持つ。 アクセスするためには、 rect.width rect.height の同じ表記法を使用することができる 。 よってこの文を使用している矩形の面積を計算することができる。

area = rect.height * rect.width;

オブジェクトを通して変数にアクセスする時、特定のオブジェクトの変数を参照する。 bob rect と異なる高さと幅をもつ長方形であるなら、この命令は次のようになる。

area = bob.height * bob.width;

この式はbobの矩形の面積を計算し、先の命令( rect の矩形の面積を求める)とは異なる結果を出す。

オブジェクトの変数名の最初の部分( objectReference.variableobjectReference)はオブジェクトへの参照でなければならないので注意する。 ここで変数名を使用することができるが、オブジェクト参照を返す式も使用することができる。new 演算子はオブジェクトの参照を返す。 よって新しいオブジェクトの変数にアクセスするために、newからの戻り値を使用することができる。

height = new Rectangle().height;

オブジェクトのメソッドの呼び出し

オブジェクトのメソッドを呼び出すことは、オブジェクトの変数を得ることに類似している。 オブジェクトのメソッドを呼び出すには、オブジェクト参照の後にピリオド(.)を付けてメソッド名を追加する。括弧内にはメソッドの引数が入る。 メソッドが引数を必要としないなら、空の括弧を使用する。

objectReference.methodName argumentList )、あるいは objectReference.methodName ();

矩形を移動する意味について考えてみる。 rect を新しい位置に移動するには、 move() メソッドを使用して次のように書く。

rect.move(15, 37);

この Java の文は、2 つの整数パラメータ15と37を持つ rect move() メソッドを呼び出す。 この文は変数 x を変更することによって、 rect オブジェクトを移動する効果があり、前に使用した割り当て文と等しい。

rect.x = 15;
rect.y = 37;

bob という異なった矩形を移動するならば、新しい位置を書く。

bob.move(244, 47);

これらの例からわかるように、メソッド呼び出しは特定のオブジェクトに命じられる。メソッド呼び出しで指定するオブジェクトは、命令に応答するオブジェクトである。 メソッド呼び出しはメッセージとしても知られている。 現実のメッセージのように、オブジェクトメッセージは特定の受信者にアドレス指定されなくてはならない。 どのオブジェクトがメッセージの受信者になるかによって、結果が異なる。 上記の例では、 rect というオブジェクト に move() メッセージを送ると、 rect が新しい位置に移動する。 bob というオブジェクト名に move() メッセージを送ると、 bob が移動する。 非常に異なった結果になる。 メッセージについて理解を深めるには、
メッセージとは何かを参照。(in the Writing Java Programs trail)

メソッド呼び出しは式であり(詳細については式を参照のこと(in the Writing Java Programs trail)‖)、値を評価する。 メソッド呼び出しの値は、もし持っているならその返り値である。 しばしば変数にメソッドの返り値を割り当てたり、あるいは別の式や文のスコープ内のメソッド呼び出しを使用したいことがある。 move() メソッドは値を返さない(voidが宣言される)。 しかし、 Rectangle の inside() メソッドは値を返す。 inside() メソッドは x 、 y 座標をとり、ポイントが矩形内あるなら trueを返す。 現在のマウスの位置のようにあるポイントが矩形内にあれば、 inside() メソッドを使用して何か特別なことができる。

if (rect.inside(mouse.x, mouse.y)) {
    . . .
        // mouse is in the rectangle
    . . .
} else {
    . . .
        // mouse is outside of the rectangle
    . . .
}

メソッド呼び出しは指定したオブジェクトへのメッセージなので注意する。 この場合、指定したオブジェクトは rect と指定される Rectangle である。 :

rect.inside(mouse.x, mouse.y)

この文は、 mouse.x mouse.y で表したマウスのカーソル位置が rect の中にあるかどうか尋ねている。 同じメッセージを bob に送信したら、異なった応答を得るであろう。

前述の通り、メソッド呼び出し objectReference.method() objectReference は、オブジェクト参照型でなくてはならない。 ここで変数名を使用することができるが、オブジェクト参照を返す式も使用することができる。new演算子はオブジェクトに参照を返すので、newからの戻り値を使用して、新規のオブジェクトメソッドを呼び出すことができる。

new Rectangle(0, 0, 100, 50).equals(anotherRect)

new Rectangle(0, 0, 100, 50)の式が Rectangle オブジェクトを参照するオブジェクト参照を 評価する。 見てわかるように、新規の矩形が equals()の引数リストに指定されているものと同等であるか判断するために、ドット表記法を使用して新規矩形のequals()メソッドを呼び出すことができる。


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