サイズ: 6983
コメント:
|
← 2011-10-27 05:50:29時点のリビジョン55 ⇥
サイズ: 6848
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 3: | 行 3: |
クラスのもつ機能を定義したものをメソッドといいます。 メソッドはオブジェクトに対する(オブジェクトを利用した)処理を記述したものとも言えます。 |
クラスのもつ機能や動作、操作を定義したものをメソッドといいます。 メソッドはインスタンス(クラスのオブジェクト)に対する(オブジェクトを利用した)処理を記述したものとも言えます。 |
行 50: | 行 50: |
void show() { System.out.printf("%s %d\n", this.name, this.price); } }}} このメソッドは指定されたインスタンス内の変数の値を表示するものです。 <<BR>>値を返さないので型はvoidです。 これを属性の定義の後ろ(5行目)に追加します。 ---- === メソッドの利用 === 値を返さないメソッドの使い方は '''インスタンス.メソッド();''' です。 {{{ a.show(); }}} のように、インスタンスとメソッド名をピリオドでつなぎ後ろに括弧を書きます。 void(値を返さない)型のメソッドの場合 インスタンスxxxに対してメソッドyyy()を行う のように解釈すればよい。 この場合は「インスタンスaに対してshow()を行う」と読めます。 最初のプログラムでprint文で書いていたところをすべて、この形に書き直すとこのようになります。 {{{#!java public class Item { String name; int price; |
|
行 54: | 行 89: |
}}} これをmainメソッドの前に追加しましょう。 {{{#!java public class Item { String name; int price; void show() { System.out.printf("%s %d\n", this.name, this.price); } |
|
行 69: | 行 92: |
...(そのまま) | Item a, b, c, d; a = new Item(); a.name="りんご"; a.price=100; b = new Item(); b.name="おにぎり"; b.price=120; c = new Item(); c.name="お茶"; c.price=150; a.show(); b.show(); c.show(); |
行 73: | 行 112: |
---- === メソッドの利用 === 値を返さないメソッドの使い方は '''インスタンス.メソッド();''' です。 {{{ a.show(); }}} のように、インスタンスとメソッド名をピリオドでつなぎ後ろに括弧を書きます。 void(値を返さない)型のメソッドの場合 インスタンスxxxに対してメソッドyyy()を行う のように解釈すればよい。 この場合は「インスタンスaに対してshow()を行う」と読めます。 |
|
行 95: | 行 118: |
25行目の |
---- ==== 例 ==== 上のプログラムで変数a,b,cの値は次のようでした。(前回の解答参照) . {{attachment:kekka2.png}} すなわち * aの値は,アドレス4a5ab2にあるItemクラスのインスタンス * bの値は,アドレス1888759にあるItemクラスのインスタンス * cの値は,アドレス6e1408にあるItemクラスのインスタンス さて、27行目の |
行 98: | 行 129: |
ではaの値がthisに渡されて実行されるので、aが参照しているItemインスタンス内の変数の値が表示されます。 | が実行されたときの動作を追ってみましょう。 1. aの値がthisに渡され 1. showの本体が実行される aの値がthisに渡されると、thisの値は Item@4a5ab2 となり aが指しているItemクラスのインスタンスをthisで参照できることになります。 showメソッドの本体では this.nameとthis.priceの値を表示しています。 したがって . a.show(); が行われると、 aが参照しているItemインスタンス内の変数の値が表示されます。 |
行 101: | 行 145: |
26行目の | 同様に、28行目の |
行 103: | 行 147: |
ではbの値がthisに渡されて実行されるので、bが参照しているDrinkインスタンス内の3つの変数の値が表示されます。 ---- === 値を修正するメソッド === メソッド内で、thisが指しているオブジェクト内の変数の値を修正することもできます。 例としてsetYoryoメソッドを示します。 {{{#!java void setYoryo(int ryo) { this.yoryo = ryo; } }}} このメソッドは引数をとるので、呼び出し側でも引数の指定が必要です。 mainメソッド内で {{{ b.setYoryo(250); }}} を行うと、 bの指しているオブジェクト内の変数yoryoの値が250に修正されます。 |
ではbの値がthisに渡されて実行されるので、 bが参照しているItemインスタンス内の変数の値が表示されます。 |
行 134: | 行 156: |
int getYoryo() { return this.yoryo; } }}} . この例では値を返すことしかしていませんが、通常はその前に計算などの処理が入ります。 |
int getPrice() { return this.price; } }}} . この例では値を返すことしかしていませんが、計算などの処理も行えます。 |
行 144: | 行 166: |
System.out.println( a.getYoryo() ); }}} |
goukei = a.getPrice() + b.getPrice() + c.getPrice(); }}} private属性の値を返すだけのメソッドはしばしば利用されます。 ---- === 値を修正するメソッド === メソッド内で、thisが指しているオブジェクト内の変数の値を修正することもできます。 例としてsetPriceメソッドを示します。 {{{#!java void setPrice(int n) { this.price = n; } }}} このメソッドは引数をとるので、呼び出し側でも引数の指定が必要です。 mainメソッド内で {{{ b.setPrice(250); }}} を行うと、 bの指しているオブジェクト内の変数priceの値が250に修正されます。 private属性の値を修正するメソッドはしばしば利用されます。 |
行 148: | 行 196: |
=== setYoryo(), getYoryo() === こんなメソッドを使わなくても、オブジェクト内の変数を直接参照すれば同じ処理が簡単に書けます。 |
=== setPrice(), getPrice() === こんなメソッドを使わなくても、オブジェクト内の変数を直接参照すれば同じ処理が簡単に書けると思ったことでしょう。 |
行 154: | 行 202: |
属性をprivateにしておき、 | |
行 156: | 行 205: |
行 166: | 行 216: |
void disp() { System.out.printf("%s \\%d %d ml\n", namae, kakaku, yoryo ); |
void show() { System.out.printf("%s %d\n", name, price); |
行 175: | 行 225: |
void setYoryo(int yoryo) { this.yoryo = yoryo; } }}} yoryoという同じ名前がありますがthisを使うことで区別ができます。 . yoryoは引数 . this.yoryoはインスタンス内の変数 ----- === メソッドの継承 === スーパークラスで定義されたメソッドはサブクラスでも利用できます。 {{{#!java public class Item { ... void dispName() ... } }}} 例えば、スーパークラスであるItemクラスでメソッドdispName()が定義されている時を考えます。 Drinkクラスのインスタンスに対してdispName()メソッドの呼び出しが行われたらどうなるでしょうか。 サブクラスであるDrinkクラスでメソッドdispName()が定義されているかどうかで処理が異なります。 (1)DrinkクラスでメソッドdispName()が定義されていないとき スーパークラスであるItemクラスで定義されているメソッドが使われます。 (2)DrinkクラスでメソッドdispName()が定義されているとき Drinkクラスで定義されているメソッドが使われます。 スーパークラスで定義されているメソッドと同じ名前のメソッドを サブクラスで再定義することもできます。 この場合サブクラスで定義したメソッドが優先されます。(2)の場合です。 これをメソッドの'''オーバーライド'''といいます。 どのクラスのメソッドが実行されるのか 1. インスタンスの属するクラスに対応するメソッドがあれば、それを実行する。 1. 無いときはスーパークラスの同じ名前のメソッドを探して、それを実行する。 1. 見つからないときは、親の親の親...と順に探します。 1. どうしても見つからないときはエラーになります。 |
void setPrice(int price) { this.price = price; } }}} priceという同じ名前がありますがthisを使うことで区別ができます。 . priceは引数 . this.priceはインスタンス内の変数 |
メソッド
クラスのもつ機能や動作、操作を定義したものをメソッドといいます。
メソッドはインスタンス(クラスのオブジェクト)に対する(オブジェクトを利用した)処理を記述したものとも言えます。
Itemクラスのメソッドを定義してみましょう。
前回作成したプログラムはこのようでした。
- 行番号表示/非表示切替
1 public class Item 2 { 3 String name; 4 int price; 5 6 public static void main(String[] args) 7 { 8 Item a, b, c, d; 9 10 a = new Item(); 11 a.name="りんご"; 12 a.price=100; 13 14 b = new Item(); 15 b.name="おにぎり"; 16 b.price=120; 17 18 c = new Item(); 19 c.name="お茶"; 20 c.price=150; 21 22 System.out.printf("%s %d\n", a.name, a.price); 23 System.out.printf("%s %d\n", b.name, b.price); 24 System.out.printf("%s %d\n", c.name, c.price); 25 } 26 }
22~24行目に各変数の指しているオブジェクトの値を表示するためのprint文があります。
この部分をメソッドを使って書き直します。
メソッドの定義
Item.javaにshowという名前のメソッドを追加します。
showメソッドの定義は4行で書けます。
- 行番号表示/非表示切替
1 void show() 2 { 3 System.out.printf("%s %d\n", this.name, this.price); 4 }
このメソッドは指定されたインスタンス内の変数の値を表示するものです。
値を返さないので型はvoidです。
これを属性の定義の後ろ(5行目)に追加します。
メソッドの利用
値を返さないメソッドの使い方は
インスタンス.メソッド();
です。
a.show();
のように、インスタンスとメソッド名をピリオドでつなぎ後ろに括弧を書きます。
void(値を返さない)型のメソッドの場合
- インスタンスxxxに対してメソッドyyy()を行う
のように解釈すればよい。
この場合は「インスタンスaに対してshow()を行う」と読めます。
最初のプログラムでprint文で書いていたところをすべて、この形に書き直すとこのようになります。
- 行番号表示/非表示切替
1 public class Item 2 { 3 String name; 4 int price; 5 6 void show() 7 { 8 System.out.printf("%s %d\n", this.name, this.price); 9 } 10 11 public static void main(String[] args) 12 { 13 Item a, b, c, d; 14 15 a = new Item(); 16 a.name="りんご"; 17 a.price=100; 18 19 b = new Item(); 20 b.name="おにぎり"; 21 b.price=120; 22 23 c = new Item(); 24 c.name="お茶"; 25 c.price=150; 26 27 a.show(); 28 b.show(); 29 c.show(); 30 } 31 }
メソッドの動作
メソッドが
- インスタンス.メソッド();
として呼び出されると、このときのインスタンスの値が this に対応付けられてから、 メソッド本体が実行されます。
例
上のプログラムで変数a,b,cの値は次のようでした。(前回の解答参照)
すなわち
- aの値は,アドレス4a5ab2にあるItemクラスのインスタンス
- bの値は,アドレス1888759にあるItemクラスのインスタンス
- cの値は,アドレス6e1408にあるItemクラスのインスタンス
さて、27行目の
- a.show();
が実行されたときの動作を追ってみましょう。
- aの値がthisに渡され
- showの本体が実行される
aの値がthisに渡されると、thisの値は Item@4a5ab2 となり aが指しているItemクラスのインスタンスをthisで参照できることになります。
showメソッドの本体では this.nameとthis.priceの値を表示しています。
したがって
- a.show();
が行われると、 aが参照しているItemインスタンス内の変数の値が表示されます。
同様に、28行目の
- b.show();
ではbの値がthisに渡されて実行されるので、 bが参照しているItemインスタンス内の変数の値が表示されます。
値を返すメソッド
値を返すメソッドは次のように記述します
- メソッド定義の先頭で返す型を指定
- メソッド本体ではreturn文を使って値を返す 行番号表示/非表示切替
1 int getPrice() 2 { 3 return this.price; 4 }
- この例では値を返すことしかしていませんが、計算などの処理も行えます。
値を返すメソッドは計算式の中で使えます。 呼び出し方は同じです。
goukei = a.getPrice() + b.getPrice() + c.getPrice();
private属性の値を返すだけのメソッドはしばしば利用されます。
値を修正するメソッド
メソッド内で、thisが指しているオブジェクト内の変数の値を修正することもできます。
例としてsetPriceメソッドを示します。
- 行番号表示/非表示切替
1 void setPrice(int n) 2 { 3 this.price = n; 4 }
このメソッドは引数をとるので、呼び出し側でも引数の指定が必要です。
mainメソッド内で
b.setPrice(250);
を行うと、 bの指しているオブジェクト内の変数priceの値が250に修正されます。
private属性の値を修正するメソッドはしばしば利用されます。
setPrice(), getPrice()
こんなメソッドを使わなくても、オブジェクト内の変数を直接参照すれば同じ処理が簡単に書けると思ったことでしょう。
小さなプログラムの場合はそれでかまいませんが、 大きなプログラムや堅牢性が要求される場合には、この形のメソッドが多用されます。
属性をprivateにしておき、 値の参照や修正をメソッドを使って行うようにすれば、 オブジェクトの状態をすべてクラス内で管理できるからです。
this
thisはキーワードです。
- 変数のように見えますが代入することはできません。
あいまいさが無いときはthis.を省略することができます。
このページで示したメソッドではthis.がなくてもどの変数を指しているか明らかなので省略して
- 行番号表示/非表示切替
1 void show() 2 { 3 System.out.printf("%s %d\n", name, price); 4 }
のように書けます。
thisを使って次のように書くこともしばしば行われます。
void setPrice(int price) { this.price = price; }
priceという同じ名前がありますがthisを使うことで区別ができます。
- priceは引数
- this.priceはインスタンス内の変数