4607
コメント:
|
5437
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 9: | 行 9: |
クラス図には次の3つの機能(メソッド)が書かれています。 | クラス図には次の4つの機能(メソッド)が書かれています。 |
行 12: | 行 12: |
. zoryo( ) | . setYoryo( ) . getYoryo(...) |
行 79: | 行 80: |
上の例では aの値がthisに渡されるため、aが参照しているDrinkインスタンス内の3つの変数の値が表示されます。 |
25行目の . a.disp(); ではaの値がthisに渡されて実行されるので、aが参照しているDrinkインスタンス内の3つの変数の値が表示されます。 26行目の . b.disp(); ではbの値がthisに渡されて実行されるので、bが参照しているDrinkインスタンス内の3つの変数の値が表示されます。 |
行 83: | 行 89: |
=== 値を修正するメソッド === メソッド内で、thisが指しているオブジェクト内の変数の値を修正することもできます。 |
|
行 84: | 行 92: |
{{{#!java void add1() { rank = rank + 1; } public static void main(String[] args) { Card a; a = new Card("ハート", 12); a.add1(); a.show(); } |
setYoryoメソッドだけを示します。 dispメソッドと同様の位置に追加してください。 {{{ void setYoryo(int ryo) { this.yoryo = ryo; } |
行 99: | 行 102: |
メッソドadd1はrankの値を1増やします。 | このメソッドは引数をとるので、呼び出し側でも引数の指定が必要です。 |
行 101: | 行 104: |
この例では、aの値は「ハートの13」になります。 | mainメソッド内で {{{ b.setYoryo(250); }}} を行うと、 bの指しているオブジェクト内の変数yoryoの値が250に修正されます。 |
行 104: | 行 113: |
値を返すメソッドを記述することもできます。 {{{#!java boolean efuda() { return (rank > 10); } public static void main(String[] args) { Card a; a = new Card("ハート", 12); if (a.efuda()) System.out.println( "aは絵札" ); } |
=== 値を返すメソッド === 値を返すメソッドは次のように記述します . メソッド定義の先頭で返す型を指定 . メソッド本体ではreturn文を使って値を返す {{{ int getYoryo() { return this.yoryo; } }}} 値を返すメソッドは計算式の中で使えます。 呼び出し方は同じです。 {{{ System.out.println( a.getYoryo() ); |
行 121: | 行 129: |
---- 引数をもつメソッドの例です。 |
----- === setXxx(), getXxx === --- === this === thisはキーワードです。 |
行 124: | 行 135: |
{{{#!java int sa(Card c) { return (rank - c.rank); } public static void main(String[] args) { Card a, b; a = new Card("ハート", 12); b = new Card("スペード", 3); System.out.println( "差は" + a.sa(b) ); } |
変数のように見えますが代入することはできません。 あいまいさが無いときはthis.を省略することができます。 このページで示したプログラムではthis.がなくてもどの変数を指しているか明らかなので省略して {{{ void disp() { System.out.printf("%s \\%d %dml\n", namae, kakaku, yoryo ); |
行 139: | 行 146: |
のように書けます。 |
メソッド
クラスのもつ機能を定義したものをメソッドといいます。
メソッドはオブジェクトに対する(オブジェクトを利用した)処理を記述したものとも言えます。
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に修正されます。
値を返すメソッド
値を返すメソッドは次のように記述します
- メソッド定義の先頭で返す型を指定
- メソッド本体ではreturn文を使って値を返す
int getYoryo() { return this.yoryo; }
値を返すメソッドは計算式の中で使えます。 呼び出し方は同じです。
System.out.println( a.getYoryo() );
setXxx(), getXxx
---
this
thisはキーワードです。
変数のように見えますが代入することはできません。
あいまいさが無いときはthis.を省略することができます。
このページで示したプログラムではthis.がなくてもどの変数を指しているか明らかなので省略して
void disp() { System.out.printf("%s \\%d %dml\n", namae, kakaku, yoryo ); }
のように書けます。
メソッドの継承
スーパークラスで定義されたメソッドはサブクラスでも利用できます。
クラス1でメソッドmethod1()が定義されている時には、 そのサブクラスでmethod1()が定義されていなくても利用できるということです。
呼び出しが行われたら、スーパークラスで定義されているメソッドが使われます。
スーパークラスで定義されているメソッドと同じ名前のメソッドを サブクラスで再定義することもできます。 この場合サブクラスで定義したメソッドが優先されます。
これをメソッドのオーバーライドといいます。
どのクラスのメソッドが実行されるのか
- インスタンスの属するクラスに対応するメソッドがあれば、それを実行する。
- 無いときはスーパークラスの同じ名前のメソッドを探して、それを実行する。
- 見つからないときは、親の親の親...と順に探します。
- どうしても見つからないときはエラーになります。