サイズ: 2318
コメント:
|
サイズ: 6551
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 7: | 行 7: |
Cardクラスを例として説明します。 | Drinkクラスのメソッドを定義してみましょう。 . {{attachment:drink.png}} クラス図には次の4つの機能(メソッド)が書かれています。 . Drink(...) . disp( ) . setYoryo( ) . getYoryo(...) クラス名と同じ名前のメソッドはコンストラクタと呼ばれ、別の機能を持ちます。次ページで解説。 |
行 9: | 行 16: |
このページでは普通のメソッドについて解説します。 | |
行 10: | 行 18: |
=== メソッドの定義 === | |
行 11: | 行 20: |
public class Card | public class Drink extends Item |
行 13: | 行 22: |
String suit; int rank; Card(String s, int r) |
int yoryo; void disp() |
行 18: | 行 26: |
suit = s; rank = r; } void show() { System.out.println( suit + " " + rank ); |
System.out.printf("%s \\%d %dml\n", this.namae, this.kakaku, this.yoryo ); |
行 29: | 行 31: |
Card a, b; | Drink a; Drink b; |
行 31: | 行 34: |
a = new Card("ハート", 12); b = new Card("スペード", 3); a.show(); b.show(); |
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(); |
行 39: | 行 50: |
このクラスのメソッドとして show が定義されています。 使い方は {{{#!java a.show(); |
Drinkクラスのメソッドとして disp を定義しました。 . 値を返さないので、メソッドの型にはvoidと書きます。 . 本体は次の1行で、動作はオブジェクトの namae, kakaku, yoryo 3つの値の表示です。 {{{ System.out.printf("%s \\%d %dml\n", this.namae, this.kakaku, this.yoryo ); |
行 44: | 行 57: |
のように、インスタンスとメソッド名をピリオドでつなぎ括弧を書きます。 | . (注) バックスラッシュは日本語コードでは円マークです。 ---- === メソッドの使い方 === 値を返さないメソッドの使い方は '''インスタンス.メソッド();''' です。 {{{ a.disp(); }}} のように、インスタンスとメソッド名をピリオドでつなぎ後ろに括弧を書きます。 |
行 50: | 行 73: |
この場合は「インスタンスaに対してshow()を行う」と読めます。 | この場合は「インスタンスaに対してdisp()を行う」と読めます。 ---- === メソッドの動作 === メソッドが インスタンス.メソッド(); として呼び出されると、このときのインスタンスの値が this に対応付けられてから、 メソッド本体が実行されます。 |
行 52: | 行 81: |
メソッドshow()の中ではprintlnが行われています。 | 25行目の . a.disp(); ではaの値がthisに渡されて実行されるので、aが参照しているDrinkインスタンス内の3つの変数の値が表示されます。 |
行 54: | 行 85: |
ここで参照されているsuitとrankは、呼び出しで指定されたインスタンスaの変数が使われます。 | 26行目の . b.disp(); ではbの値がthisに渡されて実行されるので、bが参照しているDrinkインスタンス内の3つの変数の値が表示されます。 |
行 56: | 行 90: |
=== 値を修正するメソッド === メソッド内で、thisが指しているオブジェクト内の変数の値を修正することもできます。 setYoryoメソッドだけを示します。 dispメソッドと同様の位置に追加してください。 |
|
行 58: | 行 97: |
void add1() { rank = rank + 1; } public static void main(String[] args) { Card a; a = new Card("ハート", 12); a.add1(); a.show(); } |
void setYoryo(int ryo) { this.yoryo = ryo; } |
行 72: | 行 103: |
メッソドadd1はrankの値を1増やします。 | このメソッドは引数をとるので、呼び出し側でも引数の指定が必要です。 |
行 74: | 行 105: |
この例では、aの値は「ハートの13」になります。 | mainメソッド内で {{{ b.setYoryo(250); }}} を行うと、 bの指しているオブジェクト内の変数yoryoの値が250に修正されます。 |
行 77: | 行 114: |
値を返すメソッドを記述することもできます。 | === 値を返すメソッド === 値を返すメソッドは次のように記述します . メソッド定義の先頭で返す型を指定 . メソッド本体ではreturn文を使って値を返す {{{#!java int getYoryo() { return this.yoryo; } }}} . この例では値を返すことしかしていませんが、通常はその前に計算などの処理が入ります。 |
行 79: | 行 126: |
{{{#!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は絵札" ); } |
値を返すメソッドは計算式の中で使えます。 呼び出し方は同じです。 {{{ System.out.println( a.getYoryo() ); |
行 94: | 行 132: |
----- === setYoryo(), getYoryo() === こんなメソッドを使わなくても、オブジェクト内の変数を直接参照すれば同じ処理が簡単に書けます。 小さなプログラムの場合はそれでかまいませんが、 大きなプログラムや堅牢性が要求される場合には、この形のメソッドが多用されます。 値の参照や修正をメソッドを使って行うようにすれば、 オブジェクトの状態をすべてクラス内で管理できるからです。 |
|
行 95: | 行 142: |
引数をもつメソッドの例です。 | === this === thisはキーワードです。 |
行 97: | 行 145: |
{{{#!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.がなくてもどの変数を指しているか明らかなので省略して {{{#!java void disp() { System.out.printf("%s \\%d %dml\n", namae, kakaku, yoryo ); |
行 112: | 行 156: |
のように書けます。 thisを使って次のように書くこともしばしば行われます。 {{{ void setYoryo(int yoryo) { this.yoryo = yoryo; } }}} yoryoという同じ名前がありますがthisを使うことで区別ができます。 . yoryoは引数 . this.yoryoはインスタンス内の変数 ----- === メソッドの継承 === スーパークラスで定義されたメソッドはサブクラスでも利用できます。 {{{#!java public class クラス1 { void method1() ... } }}} クラス1でメソッドmethod1()が定義されている時には、 そのサブクラスでmethod1()が定義されていなくても利用できるということです。 呼び出しが行われたら、スーパークラスで定義されているメソッドが使われます。 スーパークラスで定義されているメソッドと同じ名前のメソッドを サブクラスで再定義することもできます。 この場合サブクラスで定義したメソッドが優先されます。 これをメソッドのオーバーライドといいます。 どのクラスのメソッドが実行されるのか . インスタンスの属するクラスに対応するメソッドがあれば、それを実行する。 . 無いときはスーパークラスの同じ名前のメソッドを探して、それを実行する。 . 見つからないときは、親の親の親...と順に探します。 . どうしても見つからないときはエラーになります。 |
メソッド
クラスのもつ機能を定義したものをメソッドといいます。
メソッドはオブジェクトに対する(オブジェクトを利用した)処理を記述したものとも言えます。
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と書きます。
- 本体は次の1行で、動作はオブジェクトの namae, kakaku, yoryo 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メソッドと同様の位置に追加してください。
このメソッドは引数をとるので、呼び出し側でも引数の指定が必要です。
mainメソッド内で
b.setYoryo(250);
を行うと、 bの指しているオブジェクト内の変数yoryoの値が250に修正されます。
値を返すメソッド
値を返すメソッドは次のように記述します
- メソッド定義の先頭で返す型を指定
- メソッド本体ではreturn文を使って値を返す
- この例では値を返すことしかしていませんが、通常はその前に計算などの処理が入ります。
値を返すメソッドは計算式の中で使えます。 呼び出し方は同じです。
System.out.println( a.getYoryo() );
setYoryo(), getYoryo()
こんなメソッドを使わなくても、オブジェクト内の変数を直接参照すれば同じ処理が簡単に書けます。
小さなプログラムの場合はそれでかまいませんが、 大きなプログラムや堅牢性が要求される場合には、この形のメソッドが多用されます。
値の参照や修正をメソッドを使って行うようにすれば、 オブジェクトの状態をすべてクラス内で管理できるからです。
this
thisはキーワードです。
- 変数のように見えますが代入することはできません。
あいまいさが無いときはthis.を省略することができます。
このページで示したメソッドではthis.がなくてもどの変数を指しているか明らかなので省略して
のように書けます。
thisを使って次のように書くこともしばしば行われます。
void setYoryo(int yoryo) { this.yoryo = yoryo; }
yoryoという同じ名前がありますがthisを使うことで区別ができます。
- yoryoは引数
- this.yoryoはインスタンス内の変数
メソッドの継承
スーパークラスで定義されたメソッドはサブクラスでも利用できます。
クラス1でメソッドmethod1()が定義されている時には、 そのサブクラスでmethod1()が定義されていなくても利用できるということです。
呼び出しが行われたら、スーパークラスで定義されているメソッドが使われます。
スーパークラスで定義されているメソッドと同じ名前のメソッドを サブクラスで再定義することもできます。 この場合サブクラスで定義したメソッドが優先されます。
これをメソッドのオーバーライドといいます。
どのクラスのメソッドが実行されるのか
- インスタンスの属するクラスに対応するメソッドがあれば、それを実行する。
- 無いときはスーパークラスの同じ名前のメソッドを探して、それを実行する。
- 見つからないときは、親の親の親...と順に探します。
- どうしても見つからないときはエラーになります。