welcome: please sign in
location: "メソッド"の差分
10と21のリビジョン間の差分 (その間の編集: 11回)
2008-11-12 06:36:51時点のリビジョン10
サイズ: 2318
編集者: masahiko
コメント:
2009-10-23 12:06:59時点のリビジョン21
サイズ: 5073
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 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と書きます。
 . 内容は3つの値を表示するものです。
 {{{
 System.out.printf("%s \\%d %dml\n", this.namae, this.kakaku, this.yoryo );
行 44: 行 57:
のように、インスタンスとメソッド名をピリオドでつなぎ括弧を書きます。 ----
=== メソッドの使い方 ===
値を返さないメソッドの使い方は
 '''インスタンス.メソッド();'''
です。

 {{{
 a.disp();
 }}}
のように、インスタンスとメソッド名をピリオドでつなぎ後ろに括弧を書きます。
行 50: 行 72:
この場合は「インスタンスaに対してshow()を行う」と読めます。 この場合は「インスタンスaに対してdisp()を行う」と読めます。
----
=== メソッドの動作 ===
メソッドが
 インスタンス.メソッド();
として呼び出されると、このときのインスタンスの値が this に対応付けられてから、
メソッド本体が実行されます。
行 52: 行 80:
メソッドshow()の中ではprintlnが行われています。 25行目の
 . a.disp();
ではaの値がthisに渡されて実行されるので、aが参照しているDrinkインスタンス内の3つの変数の値が表示されます。
行 54: 行 84:
ここで参照されているsuitとrankは、呼び出しで指定されたインスタンスaの変数が使われます。 26行目の
 . b.disp();
ではbの値がthisに渡されて実行されるので、bが参照しているDrinkインスタンス内の3つの変数の値が表示されます。
行 56: 行 89:
=== 値を修正するメソッド ===
メソッド内で、thisが指しているオブジェクト内の変数の値を修正することもできます。
 {{{#!java
 public class Drink extends Item
 {
     ...
行 57: 行 96:
 {{{#!java
  void add1()
  {
   rank = rank + 1;
  }
 
  public static void main(String[] args)
  {
   Card a;
   a = new Card("ハート", 12);
   a.add1();
   a.show();
  }
     void zoryo()
     {
         this.yoryo = (int)(1.10 * this.yoryo);
     }

     ...

     public static void main(String[] args)
     {
         ...
         a.zoryo();
     }
 }
行 112: 行 151:
-----
=== メソッドの継承 ===

スーパークラスで定義されたメソッドはサブクラスでも利用できます。
 {{{#!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と書きます。
  • 内容は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が指しているオブジェクト内の変数の値を修正することもできます。

  •    1  public class Drink extends Item
       2  {
       3      ...
       4 
       5      void zoryo()
       6      {
       7          this.yoryo = (int)(1.10 * this.yoryo);
       8      }
       9 
      10      ...
      11 
      12      public static void main(String[] args)
      13      {
      14          ...
      15          a.zoryo();
      16      }
      17  }
    

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

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


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

  •    1         boolean efuda()
       2         {
       3                 return (rank > 10);
       4         }
       5  
       6         public static void main(String[] args)
       7         {
       8                 Card a;
       9                 a = new Card("ハート", 12);
      10                 if (a.efuda())
      11                         System.out.println( "aは絵札" );
      12         }
    


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

  •    1         int sa(Card c)
       2         {
       3                 return (rank - c.rank);
       4         }
       5         
       6         public static void main(String[] args)
       7         {
       8                 Card a, b;              
       9                 a = new Card("ハート", 12);
      10                 b = new Card("スペード", 3);
      11                 System.out.println( "差は" + a.sa(b) );
      12         }
      13  }
    


メソッドの継承

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

  •    1  public class クラス1
       2  {
       3      void method1()
       4      ...
       5  }
    

クラス1でメソッドmethod1()が定義されている時には、 そのサブクラスでmethod1()が定義されていなくても利用できるということです。

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

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

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

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

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

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