メソッド
クラスのもつ機能を定義したものをメソッドといいます。
メソッドはオブジェクトに対する(オブジェクトを利用した)処理を記述したものとも言えます。
Drinkクラスのメソッドを定義してみましょう。
クラス図には次の4つの機能(メソッド)が書かれています。
- Drink(...)
- disp( )
- setYoryo( )
- getYoryo(...)
クラス名と同じメソッドはコンストラクタと呼ばれ、別の機能を持ちます。次ページで解説。
このページでは普通のメソッドについて解説します。
メソッドの定義
1 public class Drink extends Item 2 { 3 int yoryo; 4 5 void disp() 6 { 7 System.out.printf("%s \\%d %dml\n", this.namae, this.kakaku, this.yoryo ); 8 } 9 10 public static void main(String[] args) 11 { 12 Drink a; 13 Drink b; 14 15 a = new Drink(); 16 a.namae = "麦茶"; 17 a.kakaku = 120; 18 a.yoryo = 500; 19 20 b = new Drink(); 21 b.namae = "紅茶"; 22 b.kakaku = 130; 23 b.yoryo = 500; 24 25 a.disp(); 26 b.disp(); 27 } 28 }
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に修正されます。
値を返すメソッドを記述することもできます。
引数をもつメソッドの例です。
メソッドの継承
スーパークラスで定義されたメソッドはサブクラスでも利用できます。
クラス1でメソッドmethod1()が定義されている時には、 そのサブクラスでmethod1()が定義されていなくても利用できるということです。
呼び出しが行われたら、スーパークラスで定義されているメソッドが使われます。
スーパークラスで定義されているメソッドと同じ名前のメソッドを サブクラスで再定義することもできます。 この場合サブクラスで定義したメソッドが優先されます。
これをメソッドのオーバーライドといいます。
どのクラスのメソッドが実行されるのか
- インスタンスの属するクラスに対応するメソッドがあれば、それを実行する。
- 無いときはスーパークラスの同じ名前のメソッドを探して、それを実行する。
- 見つからないときは、親の親の親...と順に探します。
- どうしても見つからないときはエラーになります。