welcome: please sign in
location: "メソッド"の差分
49と50のリビジョン間の差分
2010-11-06 13:09:15時点のリビジョン49
サイズ: 6006
編集者: masahiko
コメント:
2010-11-06 13:23:34時点のリビジョン50
サイズ: 5905
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 120: 行 120:
 . 上のプログラムに次の行を付け加えて実行すると次のように表示されます。
 {{{
  System.out.println(a);
  System.out.println(b);
  System.out.println(c);
 }}}
 . 上のプログラムで変数a,b,cの値は次のようでした。(前回の解答参照)

メソッド

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

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

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

27行目の

  • a.show();

ではaの値がthisに渡されて実行されるので、aが参照しているItemインスタンス内の変数の値が表示されます。

  • itemObject.png

28行目の

  • b.show();

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


値を修正するメソッド

メソッド内で、thisが指しているオブジェクト内の変数の値を修正することもできます。

例としてsetYoryoメソッドを示します。

  •    1  void setYoryo(int ryo)
       2  {
       3      this.yoryo = ryo;
       4  }
    

このメソッドは引数をとるので、呼び出し側でも引数の指定が必要です。

mainメソッド内で

  •  b.setYoryo(250);

を行うと、 bの指しているオブジェクト内の変数yoryoの値が250に修正されます。


値を返すメソッド

値を返すメソッドは次のように記述します

  • メソッド定義の先頭で返す型を指定
  • メソッド本体ではreturn文を使って値を返す
       1  int getYoryo()
       2  {
       3      return this.yoryo;
       4  }
    
  • この例では値を返すことしかしていませんが、通常はその前に計算などの処理が入ります。

値を返すメソッドは計算式の中で使えます。 呼び出し方は同じです。

  •  System.out.println( a.getYoryo() );


setYoryo(), getYoryo()

こんなメソッドを使わなくても、オブジェクト内の変数を直接参照すれば同じ処理が簡単に書けます。

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

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


this

thisはキーワードです。

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

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

このページで示したメソッドではthis.がなくてもどの変数を指しているか明らかなので省略して

  •    1  void disp()
       2  {
       3      System.out.printf("%s \\%d %d ml\n", namae, kakaku, yoryo );
       4  }
    

のように書けます。

thisを使って次のように書くこともしばしば行われます。

  •  void setYoryo(int yoryo)
     {
         this.yoryo = yoryo;
     }

yoryoという同じ名前がありますがthisを使うことで区別ができます。

  • yoryoは引数
  • this.yoryoはインスタンス内の変数

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