welcome: please sign in
location: "メソッド"の差分
17と55のリビジョン間の差分 (その間の編集: 38回)
2009-10-23 05:52:49時点のリビジョン17
サイズ: 4437
編集者: masahiko
コメント:
2011-10-27 05:50:29時点のリビジョン55
サイズ: 6848
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 3: 行 3:
クラスのもつ機能を定義したものをメソッドといいます。

メソッドはオブジェクトに対する(オブジェクトを利用した)処理を記述したものとも言えます。

Drinkクラスのメソッドを定義してみましょう。
 . {{attachment:drink.png}}
クラス図には次の3つの機能(メソッド)が書かれています。
 . Drink(...)
 . disp( )
 . zoryo( )
クラス名と同じメソッドはコンストラクタと呼ばれ、別の機能を持ちます。次ページで解説。
クラスのもつ機能や動作、操作を定義したものをメソッドといいます。

メソッドはインスタンス(クラスのオブジェクト)に対する(オブジェクトを利用した)処理を記述したものとも言えます。

Itemクラスのメソッドを定義してみましょう。
 . {{attachment:itemClass.png}}

前回作成したプログラムはこのようでした。
 {{{#!java
public class Item
{
 String name;
 int price;

 public static void main(String[] args)
 {
  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;

  System.out.printf("%s %d\n", a.name, a.price);
  System.out.printf("%s %d\n", b.name, b.price);
  System.out.printf("%s %d\n", c.name, c.price);
 }
}
 }}}

22~24行目に各変数の指しているオブジェクトの値を表示するためのprint文があります。
<<BR>>この部分をメソッドを使って書き直します。
行 16: 行 45:
 {{{#!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 ocha;
   
   ocha = new Drink();
   ocha.namae = "麦茶";
   ocha.kakaku = 120;
   ocha.yoryo = 500;
   ocha.disp();
  }
 }
 }}}

Drinkクラスのメソッドとして disp を定義しました。

 . 値を返さないので、メソッドの型にはvoidと書きます。
 . 内容は3つの値を表示するものです。
 {{{
 System.out.printf("%s \\%d %dml\n", this.namae, this.kakaku, this.yoryo );
 }}}
----
=== メソッドの使い方 ===

Item.javaにshowという名前のメソッドを追加します。

showメソッドの定義は4行で書けます。
 {{{#!java
void show()
{
 System.out.printf("%s %d\n", this.name, this.price);
}
 }}}

このメソッドは指定されたインスタンス内の変数の値を表示するものです。
<<BR>>値を返さないので型はvoidです。

これを属性の定義の後ろ(5行目)に追加します。
----
=== メソッドの利用 ===
行 53: 行 67:
 ocha.disp();
 }}}
のように、インスタンスとメソッド名をピリオドでつなぎ括弧を書きます。
 a.show();
 }}}
のように、インスタンスとメソッド名をピリオドでつなぎ後ろに括弧を書きます。
行 61: 行 75:
この場合は「インスタンスochaに対してdisp()を行う」と読めます。 この場合は「インスタンスaに対してshow()を行う」と読めます。

最初のプログラムでprint文で書いていたところをすべて、この形に書き直すとこのようになります。

 {{{#!java
public class Item
{
 String name;
 int price;

 void show()
 {
  System.out.printf("%s %d\n", this.name, this.price);
 }

 public static void main(String[] args)
 {
  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();
 }
}
 }}}
行 68: 行 118:

上の例では
ochaの値がthisに渡されるため、ochaが参照しているDrinkインスタンス内の3つの変数の値が表示されます。

----

 {{{#!java
  void add1()
  {
   rank = rank + 1;
  }
 
  public static void main(String[] args)
  {
   Card a;
   a = new Card("ハート", 12);
   a.add1();
   a.show();
  }
 }}}

メッソドadd1はrankの値を1増やします。

この例では、aの値は「ハートの13」になります。

----
値を返すメソッドを記述することもできます。

 {{{#!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は絵札" );
  }
 }}}

----
引数をもつメソッドの例です。

 {{{#!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) );
  }
 }
 }}}
----
==== 例 ====
上のプログラムで変数a,b,cの値は次のようでした。(前回の解答参照)
 . {{attachment:kekka2.png}}
すなわち
 * aの値は,アドレス4a5ab2にあるItemクラスのインスタンス
 * bの値は,アドレス1888759にあるItemクラスのインスタンス
 * cの値は,アドレス6e1408にあるItemクラスのインスタンス

さて、27行目の
 . a.show();
が実行されたときの動作を追ってみましょう。
 1. aの値がthisに渡され
 1. showの本体が実行される

aの値がthisに渡されると、thisの値は Item@4a5ab2 となり
aが指しているItemクラスのインスタンスをthisで参照できることになります。

showメソッドの本体では
this.nameとthis.priceの値を表示しています。

したがって
 . a.show();
が行われると、
aが参照しているItemインスタンス内の変数の値が表示されます。
 . {{attachment:itemObject.png}}

同様に、28行目の
 . b.show();
ではbの値がthisに渡されて実行されるので、
bが参照しているItemインスタンス内の変数の値が表示されます。

----
=== 値を返すメソッド ===
値を返すメソッドは次のように記述します
 . メソッド定義の先頭で返す型を指定
 . メソッド本体ではreturn文を使って値を返す
 {{{#!java
 int getPrice()
 {
     return this.price;
 }
 }}}
 . この例では値を返すことしかしていませんが、計算などの処理も行えます。

値を返すメソッドは計算式の中で使えます。
呼び出し方は同じです。
 {{{
 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属性の値を修正するメソッドはしばしば利用されます。
行 130: 行 196:
=== メソッドの継承 ===

スーパークラスで定義されたメソッドはサブクラスでも利用できます。
 {{{#!java
 public class クラス1
 {
     void method1()
     ...
 }
 }}}
クラス1でメソッドmethod1()が定義されている時には、
そのサブクラスでmethod1()が定義されていなくても利用できるということです。

呼び出しが行われたら、スーパークラスで定義されているメソッドが使われます。

スーパークラスで定義されているメソッドと同じ名前のメソッドを
サブクラスで再定義することもできます。
この場合サブクラスで定義したメソッドが優先されます。

これをメソッドのオーバーライドといいます。

どのクラスのメソッドが実行されるのか
 . インスタンスの属するクラスに対応するメソッドがあれば、それを実行する。
 . 無いときはスーパークラスの同じ名前のメソッドを探して、それを実行する。
 . 見つからないときは、親の親の親...と順に探します。
 . どうしても見つからないときはエラーになります。
=== setPrice(), getPrice() ===
こんなメソッドを使わなくても、オブジェクト内の変数を直接参照すれば同じ処理が簡単に書けると思ったことでしょう。

小さなプログラムの場合はそれでかまいませんが、
大きなプログラムや堅牢性が要求される場合には、この形のメソッドが多用されます。

属性をprivateにしておき、
値の参照や修正をメソッドを使って行うようにすれば、
オブジェクトの状態をすべてクラス内で管理できるからです。

----
=== this ===
thisはキーワードです。

 変数のように見えますが代入することはできません。

あいまいさが無いときは'''this.を省略'''することができます。

このページで示したメソッドではthis.がなくてもどの変数を指しているか明らかなので省略して
 {{{#!java
 void show()
 {
     System.out.printf("%s %d\n", name, price);
 }
 }}}
のように書けます。

thisを使って次のように書くこともしばしば行われます。
 {{{
 void setPrice(int price)
 {
     this.price = price;
 }
 }}}
priceという同じ名前がありますがthisを使うことで区別ができます。
  . priceは引数
  . this.priceはインスタンス内の変数

メソッド

クラスのもつ機能や動作、操作を定義したものをメソッドといいます。

メソッドはインスタンス(クラスのオブジェクト)に対する(オブジェクトを利用した)処理を記述したものとも言えます。

Itemクラスのメソッドを定義してみましょう。

  • itemClass.png

前回作成したプログラムはこのようでした。

  •    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の値は次のようでした。(前回の解答参照)

  • kekka2.png

すなわち

  • aの値は,アドレス4a5ab2にあるItemクラスのインスタンス
  • bの値は,アドレス1888759にあるItemクラスのインスタンス
  • cの値は,アドレス6e1408にあるItemクラスのインスタンス

さて、27行目の

  • a.show();

が実行されたときの動作を追ってみましょう。

  1. aの値がthisに渡され
  2. showの本体が実行される

aの値がthisに渡されると、thisの値は Item@4a5ab2 となり aが指しているItemクラスのインスタンスをthisで参照できることになります。

showメソッドの本体では this.nameとthis.priceの値を表示しています。

したがって

  • a.show();

が行われると、 aが参照しているItemインスタンス内の変数の値が表示されます。

  • itemObject.png

同様に、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はインスタンス内の変数

メソッド (最終更新日時 2011-10-27 05:50:29 更新者 masahiko)