== メソッド == クラスのもつ機能を定義したものをメソッドといいます。 メソッドはオブジェクトに対する(オブジェクトを利用した)処理を記述したものとも言えます。 Drinkクラスのメソッドを定義してみましょう。 . {{attachment:drink.png}} クラス図には次の4つの機能(メソッド)が書かれています。 . Drink(...) . disp( ) . setYoryo( ) . getYoryo(...) クラス名と同じメソッドはコンストラクタと呼ばれ、別の機能を持ちます。次ページで解説。 このページでは普通のメソッドについて解説します。 ---- === メソッドの定義 === {{{#!java public class Drink extends Item { int yoryo; void disp() { System.out.printf("%s \\%d %dml\n", this.namae, this.kakaku, this.yoryo ); } public static void main(String[] args) { Drink a; Drink b; a = new Drink(); a.namae = "麦茶"; a.kakaku = 120; a.yoryo = 500; b = new Drink(); b.namae = "紅茶"; b.kakaku = 130; b.yoryo = 500; a.disp(); b.disp(); } } }}} Drinkクラスのメソッドとして disp を定義しました。 . 値を返さないので、メソッドの型にはvoidと書きます。 . 内容は3つの値を表示するものです。 {{{ System.out.printf("%s \\%d %dml\n", this.namae, this.kakaku, this.yoryo ); }}} ---- === メソッドの使い方 === 値を返さないメソッドの使い方は '''インスタンス.メソッド();''' です。 {{{ a.disp(); }}} のように、インスタンスとメソッド名をピリオドでつなぎ後ろに括弧を書きます。 void(値を返さない)型のメソッドの場合 インスタンスxxxに対してメソッドyyy()を行う のように解釈すればよい。 この場合は「インスタンスaに対してdisp()を行う」と読めます。 ---- === メソッドの動作 === メソッドが  インスタンス.メソッド(); として呼び出されると、このときのインスタンスの値が this に対応付けられてから、 メソッド本体が実行されます。 25行目の . a.disp(); ではaの値がthisに渡されて実行されるので、aが参照しているDrinkインスタンス内の3つの変数の値が表示されます。 26行目の . b.disp(); ではbの値がthisに渡されて実行されるので、bが参照しているDrinkインスタンス内の3つの変数の値が表示されます。 ---- === 値を修正するメソッド === メソッド内で、thisが指しているオブジェクト内の変数の値を修正することもできます。 setYoryoメソッドだけを示します。 dispメソッドと同様の位置に追加してください。 {{{ void setYoryo(int ryo) { this.yoryo = ryo; } }}} このメソッドは引数をとるので、呼び出し側でも引数の指定が必要です。 mainメソッド内で {{{ b.setYoryo(250); }}} を行うと、 bの指しているオブジェクト内の変数yoryoの値が250に修正されます。 ---- === 値を返すメソッド === 値を返すメソッドは次のように記述します . メソッド定義の先頭で返す型を指定 . メソッド本体ではreturn文を使って値を返す {{{ int getYoryo() { return this.yoryo; } }}} 値を返すメソッドは計算式の中で使えます。 呼び出し方は同じです。 {{{ System.out.println( a.getYoryo() ); }}} ----- === setYoryo(), getYoryo() === こんなことをしなくてもオブジェクト内の変数を直接参照すれば可能です。 小さなプログラムの場合はそれでかまいませんが、 大きなプログラムや堅牢性が要求される場合には、この形のメソッドが多用されます。 この方法を利用すると、変数の修正などがすべてクラス内で管理できるからです。 ---- === this === thisはキーワードです。 変数のように見えますが代入することはできません。 あいまいさが無いときはthis.を省略することができます。 このページで示したプログラムではthis.がなくてもどの変数を指しているか明らかなので省略して {{{ void disp() { System.out.printf("%s \\%d %dml\n", namae, kakaku, yoryo ); } }}} のように書けます。 thisを使って次のように書くこともしばしば行われます。 {{{ void setYoryo(int yoryo) { this.yoryo = yoryo; } }}} yoryoという同じ名前がありますがthisを使うことで区別ができます。 . yoryoは引数 . this.yoryoはインスタンス内の変数 ----- === メソッドの継承 === スーパークラスで定義されたメソッドはサブクラスでも利用できます。 {{{#!java public class クラス1 { void method1() ... } }}} クラス1でメソッドmethod1()が定義されている時には、 そのサブクラスでmethod1()が定義されていなくても利用できるということです。 呼び出しが行われたら、スーパークラスで定義されているメソッドが使われます。 スーパークラスで定義されているメソッドと同じ名前のメソッドを サブクラスで再定義することもできます。 この場合サブクラスで定義したメソッドが優先されます。 これをメソッドのオーバーライドといいます。 どのクラスのメソッドが実行されるのか . インスタンスの属するクラスに対応するメソッドがあれば、それを実行する。 . 無いときはスーパークラスの同じ名前のメソッドを探して、それを実行する。 . 見つからないときは、親の親の親...と順に探します。 . どうしても見つからないときはエラーになります。