welcome: please sign in

2009-11-02 05:30:22時点のリビジョン36

メッセージを消す
location: メソッド

メソッド

クラスのもつ機能を定義したものをメソッドといいます。

メソッドはオブジェクトに対する(オブジェクトを利用した)処理を記述したものとも言えます。

Drinkクラスのメソッドを定義してみましょう。

クラス図には次の4つの機能(メソッド)が書かれています。

クラス名と同じ名前のメソッドはコンストラクタと呼ばれ、別の機能を持ちます。次ページで解説。

このページでは普通のメソッドについて解説します。


メソッドの定義

Drinkクラスのメソッドとして disp を定義しました。


メソッドの使い方

値を返さないメソッドの使い方は

です。

のように、インスタンスとメソッド名をピリオドでつなぎ後ろに括弧を書きます。

void(値を返さない)型のメソッドの場合

のように解釈すればよい。

この場合は「インスタンスaに対してdisp()を行う」と読めます。


メソッドの動作

メソッドが

として呼び出されると、このときのインスタンスの値が this に対応付けられてから、 メソッド本体が実行されます。

25行目の

ではaの値がthisに渡されて実行されるので、aが参照しているDrinkインスタンス内の3つの変数の値が表示されます。

26行目の

ではbの値がthisに渡されて実行されるので、bが参照しているDrinkインスタンス内の3つの変数の値が表示されます。


値を修正するメソッド

メソッド内で、thisが指しているオブジェクト内の変数の値を修正することもできます。

setYoryoメソッドだけを示します。 dispメソッドと同様の位置に追加してください。

このメソッドは引数をとるので、呼び出し側でも引数の指定が必要です。

mainメソッド内で

を行うと、 bの指しているオブジェクト内の変数yoryoの値が250に修正されます。


値を返すメソッド

値を返すメソッドは次のように記述します

値を返すメソッドは計算式の中で使えます。 呼び出し方は同じです。


setYoryo(), getYoryo()

こんなメソッドを使わなくても、オブジェクト内の変数を直接参照すれば同じ処理が簡単に書けます。

小さなプログラムの場合はそれでかまいませんが、 大きなプログラムや堅牢性が要求される場合には、この形のメソッドが多用されます。

値の参照や修正をメソッドを使って行うようにすれば、 オブジェクトの状態をすべてクラス内で管理できるからです。


this

thisはキーワードです。

あいまいさが無いときはthis.を省略することができます。

このページで示したメソッドではthis.がなくてもどの変数を指しているか明らかなので省略して

のように書けます。

thisを使って次のように書くこともしばしば行われます。

yoryoという同じ名前がありますがthisを使うことで区別ができます。


メソッドの継承

スーパークラスで定義されたメソッドはサブクラスでも利用できます。

例えば、スーパークラスであるItemクラスでメソッドdispNameme()が定義されている時を考えます。

Drinkクラスのインスタンスに対してdispNameme()メソッドの呼び出しが行われたらどうなるでしょうか。

サブクラスであるDrinkクラスでメソッドdispNameme()が定義されているかどうかで処理が異なります。

(1)DrinkクラスでメソッドdispNameme()が定義されていないとき

(2)DrinkクラスでメソッドdispNameme()が定義されているとき

スーパークラスで定義されているメソッドと同じ名前のメソッドを サブクラスで再定義することもできます。 この場合サブクラスで定義したメソッドが優先されます。

これをメソッドのオーバーライドといいます。

どのクラスのメソッドが実行されるのか

  1. インスタンスの属するクラスに対応するメソッドがあれば、それを実行する。
  2. 無いときはスーパークラスの同じ名前のメソッドを探して、それを実行する。
  3. 見つからないときは、親の親の親...と順に探します。
  4. どうしても見つからないときはエラーになります。