![]() ![]() ![]() ![]() | オブジェクト、クラス、インタフェース |
オブジェクトを作成したら、おそらく何かのためにそれを使用したくなる。 例えば、新規の Rectangle を作成した後で、異なった位置にそれを動かしたいと仮定する(矩形(Rectangle)はドローイングプログラムのオブジェクトで、ユーザは矩形の上でマウスをクリックすると、新しい位置にそれをドラッグできる)。矩形を移動する意味について考えてみる。Rectangle クラスは矩形を移動する 2 つの方法を提供する。
- 直接オブジェクトの
x
、y
変数を操作する
move()
メソッドを呼び出す
変数とともに直接いじるよりも、メソッドの保護レイヤを通して間接的にオブジェクトの変数を操作するので、2番目のオプションはしばしば「よりオブジェクト指向的で」より安全であると考えられる。 直接オブジェクトの変数を操作することは、しばしばエラーのきっかけになると考えられる。オブジェクトを潜在的に矛盾した状態にすることがある。 しかし、オブジェクトを操作して矛盾した状態にすることができるなら、クラスは他のオブジェクトによって直接操作できる変数をもたない(もつべきではない)。 Java では、他の型のオブジェクトによる変数やメソッドのアクセスクラスが限定できたり、可能にできるメカニズムを提供する。 この節では、他のクラスにアクセス可能なメソッドの呼び出しと変数の操作について説明する。 メンバへのアクセス制御について学習するには、クラスのメンバへのアクセスの制御を参照のこと。Rectangle の
x
とy
はすべての他のクラスにアクセス可能である。 そこで Rectangle の変数x
とy
を直接操作することは、安全であると仮定することができる。オブジェクトの変数の参照
最初に、変数x
とy
を直接変更して、Rectangle の位置を調べたり変更する方法に注目する。 次の節では、そのmove()
メソッドを呼び出して矩形を移動する方法を示す。オブジェクトの変数にアクセスするには、オブジェクト参照の後にピリオド(.)を付けて変数名を追加する。
プログラムで矩形がobjectReference.variablerect
と指定されると仮定する。 それぞれrect.x
とrect.y
で変数x
とy
にアクセスすることができる。rect
の変数名があるので、通常の変数名としてJava の文と式でそれらを使用することができる。 したがって矩形を移動するために、新しい位置を書く。Rectangle クラスは、Rectangle の外にあるオブジェクトにアクセス可能なrect.x = 15; // change x position rect.y = 37; // change y positionwidth
とheight
の 2 つの変数を持つ。 アクセスするためには、rect.width
とrect.height
の同じ表記法を使用することができる 。 よってこの文を使用している矩形の面積を計算することができる。オブジェクトを通して変数にアクセスする時、特定のオブジェクトの変数を参照する。area = rect.height * rect.width;bob
がrect
と異なる高さと幅をもつ長方形であるなら、この命令は次のようになる。この式はarea = bob.height * bob.width;bob
の矩形の面積を計算し、先の命令(rect
の矩形の面積を求める)とは異なる結果を出す。オブジェクトの変数名の最初の部分(
objectReference.variable
のobjectReference
)はオブジェクトへの参照でなければならないので注意する。 ここで変数名を使用することができるが、オブジェクト参照を返す式も使用することができる。new
演算子はオブジェクトの参照を返す。 よって新しいオブジェクトの変数にアクセスするために、new
からの戻り値を使用することができる。height = new Rectangle().height;オブジェクトのメソッドの呼び出し
objectReference.methodName ( argumentList )、あるいは objectReference.methodName ();
rect
を新しい位置に移動するには、 move()
メソッドを使用して次のように書く。この Java の文は、2 つの整数パラメータ15と37を持つrect.move(15, 37);
rect
の move()
メソッドを呼び出す。 この文は変数 x
と y
を変更することによって、 rect
オブジェクトを移動する効果があり、前に使用した割り当て文と等しい。rect.x = 15; rect.y = 37;
bob
という異なった矩形を移動するならば、新しい位置を書く。これらの例からわかるように、メソッド呼び出しは特定のオブジェクトに命じられる。メソッド呼び出しで指定するオブジェクトは、命令に応答するオブジェクトである。 メソッド呼び出しはメッセージとしても知られている。 現実のメッセージのように、オブジェクトメッセージは特定の受信者にアドレス指定されなくてはならない。 どのオブジェクトがメッセージの受信者になるかによって、結果が異なる。 上記の例では、bob.move(244, 47);
rect
というオブジェクト に move()
メッセージを送ると、 rect
が新しい位置に移動する。 bob
というオブジェクト名に move()
メッセージを送ると、 bob
が移動する。 非常に異なった結果になる。 メッセージについて理解を深めるには、メッセージとは何かを参照。メソッド呼び出しは式であり(詳細については式を参照のこと‖)、値を評価する。 メソッド呼び出しの値は、もし持っているならその返り値である。 しばしば変数にメソッドの返り値を割り当てたり、あるいは別の式や文のスコープ内のメソッド呼び出しを使用したいことがある。
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()
メソッドを呼び出すことができる。
![]() ![]() ![]() ![]() | オブジェクト、クラス、インタフェース |