welcome: please sign in
location: "メソッド"の差分
15と37のリビジョン間の差分 (その間の編集: 22回)
2009-10-23 05:44:54時点のリビジョン15
サイズ: 4071
編集者: masahiko
コメント:
2009-11-02 05:37:19時点のリビジョン37
サイズ: 7048
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 9: 行 9:
クラス図には次のつの機能(メソッド)が書かれています。 クラス図には次のつの機能(メソッド)が書かれています。
行 12: 行 12:
 . zoryo( )
クラス名と同じメソッドはコンストラクタと呼ばれ、別の機能を持ちます。次ページで解説。
 . setYoryo( )
 . getYoryo(...
)
クラス名と同じ名前のメソッドはコンストラクタと呼ばれ、別の機能を持ちます。次ページで解説。

このページでは普通のメソッドについて解説します。
行 23: 行 26:
   System.out.printf("%s \\%d %dml\n", this.namae, this.kakaku, this.yoryo );    System.out.printf("%s \\%d %d ml\n", this.namae, this.kakaku, this.yoryo );
行 28: 行 31:
   Drink ocha;    Drink a;
   Drink b;
行 30: 行 34:
   ocha = new Drink();
   ocha.namae = "麦茶";
   ocha.kakaku = 120;
   ocha.yoryo = 500;
   ocha.disp();
   a = new Drink();
   a.namae = "麦茶";
   a.kakaku = 120;
   a.yoryo = 500;

b = new Drink();
   b.namae = "紅茶";
   b.kakaku = 130;
   b.y
oryo = 500;

   
a.disp();
   b.disp();
行 42: 行 53:
 . 内容は3つの値表示するものです。
 {{{
 System.out.printf("%s \\%d %dml\n", this.namae, this.kakaku, this.yoryo );
 }}}
 . 本体次の1行で、動作はオブジェクトの namae, kakaku, yoryo 3つの値表示です。
 {{{
 System.out.printf("%s \\%d %d ml\n", this.namae, this.kakaku, this.yoryo );
 }}}
 . (注) バックスラッシュは日本語コードでは円マークです。
行 53: 行 65:
 ocha.disp();
 }}}
のように、インスタンスとメソッド名をピリオドでつなぎ括弧を書きます。
 a.disp();
 }}}
のように、インスタンスとメソッド名をピリオドでつなぎ後ろに括弧を書きます。
行 61: 行 73:
この場合は「インスタンスochaに対してdisp()を行う」と読めます。 この場合は「インスタンスaに対してdisp()を行う」と読めます。
行 69: 行 81:
上の例では
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) );
  }
 }
 }}}
----
=== 機能の継承 ===

機能(メソッド)も性質と同様に継承されます。
25行目の
 . a.disp();
ではaの値がthisに渡されて実行されるので、aが参照しているDrinkインスタンス内の3つの変数の値が表示されます。
 . {{attachment:drink2.png}}

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

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

setYoryoメソッドだけを示します。
dispメソッドと同様の位置に追加してください。

 {{{#!java
 void setYoryo(int ryo)
 {
     this.yoryo = ryo;
 }
 }}}

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

mainメソッド内で
 {{{
 b.setYoryo(250);
 }}}

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

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

値を返すメソッドは計算式の中で使えます。
呼び出し方は同じです。
 {{{
 System.out.println( a.getYoryo() );
 }}}

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

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

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

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

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

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

thisを使って次のように書くこともしばしば行われます。
 {{{
 void setYoryo(int yoryo)
 {
     this.yoryo = yoryo;
 }
 }}}
yoryoという同じ名前がありますがthisを使うことで区別ができます。
  . yoryoは引数
  . this.yoryoはインスタンス内の変数
-----
=== メソッドの継承 ===
行 136: 行 174:
 public class クラス1
 {
     void method1()
 public class Item
 {
行 140: 行 177:
 }
 }}}
クラス1でメソッドmethod1()が定義されている時には、
そのサブクラスでmethod1()が定義されていなくても利用できるということです。

呼び出しが行われたら、スーパークラスで定義されているメソッドが使われます。
     void dispName()
     ...
 }
 }}}
例えば、スーパークラスであるItemクラスでメソッドdispNameme()が定義されている時を考えます。

Drinkクラスのインスタンスに対してdispNameme()メソッドの呼び出しが行われたらどうなるでしょうか。

サブクラスであるDrinkクラスでメソッドdispNameme()が定義されているかどうかで処理が異なります。

(1)DrinkクラスでメソッドdispNameme()が定義されていないとき

 スーパークラスであるItemクラスで定義されているメソッドが使われます。

(2)DrinkクラスでメソッドdispNameme()が定義されているとき

 Drinkクラスで定義されているメソッドが使われます。
行 152: 行 200:

どのクラスのメソッドが実行されるのか
 1. インスタンスの属するクラスに対応するメソッドがあれば、それを実行する。
 1. 無いときはスーパークラスの同じ名前のメソッドを探して、それを実行する。
 1. 見つからないときは、親の親の親...と順に探します。
 1. どうしても見つからないときはエラーになります。

メソッド

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

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

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 %d ml\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 %d ml\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メソッドと同様の位置に追加してください。

  •    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 %dml\n", namae, kakaku, yoryo );
       4  }
    

のように書けます。

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

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

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

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


メソッドの継承

スーパークラスで定義されたメソッドはサブクラスでも利用できます。

  •    1  public class Item
       2  {
       3      ...
       4      void dispName()
       5      ...
       6  }
    

例えば、スーパークラスであるItemクラスでメソッドdispNameme()が定義されている時を考えます。

Drinkクラスのインスタンスに対してdispNameme()メソッドの呼び出しが行われたらどうなるでしょうか。

サブクラスであるDrinkクラスでメソッドdispNameme()が定義されているかどうかで処理が異なります。

(1)DrinkクラスでメソッドdispNameme()が定義されていないとき

  • スーパークラスであるItemクラスで定義されているメソッドが使われます。

(2)DrinkクラスでメソッドdispNameme()が定義されているとき

  • Drinkクラスで定義されているメソッドが使われます。

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

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

どのクラスのメソッドが実行されるのか

  1. インスタンスの属するクラスに対応するメソッドがあれば、それを実行する。
  2. 無いときはスーパークラスの同じ名前のメソッドを探して、それを実行する。
  3. 見つからないときは、親の親の親...と順に探します。
  4. どうしても見つからないときはエラーになります。

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