動的メソッド

上のように,多くのメソッドはあるクラスと深い関連を持っている.そのた め,静的メソッドの第1引数を略したような使い方をする動的メソッドが用意 されている.外部から呼び出し可能な動的メソッドの宣言はクラス内部で,
public 返り値の型 メソッド名(引数宣言){
  メソッド本体
}
とする.呼び出し側は「式.メソッド名(引数1, 引数2, ... , 引数n)」のよう に書く.「式」の部分は呼び出す動的メソッドを含むクラスの型の式であれば 何でも良いが,その型の変数であることが多い.

メソッド本体では,静的メソッドでの第1引数にあたる呼び出し側の「式」の 部分を受け取るのは,thisという宣言不要の変数である.

動的メソッド呼び出しの例を見てみよう.

class Point2D {
  public double x,y;
    // staticをつけないと動的メソッドとなる。
    // 2点間の距離を返すメソッドだが、1つの点は変数 thisに渡されるので
    // 引数は1つで良い。
  public double distance2D(Point2D point2){
    double dx=(this.x-point2.x),dy=(this.y-point2.y);
    return Math.sqrt(dx*dx+dy*dy);
  }
    // (0,0)との距離(ベクトルとしての長さ)を求める動的メソッド
    // 引数はいらない。
  public double length(){
    return Math.sqrt(this.x*this.x+this.y*this.y);
  }
}

public class ObjectTest4 {
  public static void main(String[] args){
    Point2D p1,p2,p3;
    p1=new Point2D();
    p1.x=0.0; 
    p1.y=0.0;
    p2=new Point2D();
    p2.x=1.0; 
    p2.y=1.0;
    p3=new Point2D();
    p3.x=0.0; 
    p3.y=1.0;
      // 動的メソッドは「式.メソッド名」のように呼び出す。
      // 式がどのクラスのオブジェクトかによって動的に実行するメソッドが決まる
    System.out.println("length of p1 = "+p1.length());
    System.out.println("length of p2 = "+p2.length());
    System.out.println("length of p3 = "+p3.length());
    System.out.println("distance between p1 and p2 "+p1.distance2D(p2));
    System.out.println("distance between p2 and p3 "+p2.distance2D(p3));
    System.out.println("distance between p3 and p1 "+p3.distance2D(p1));
  }
}
上の例では動的メソッドの中で同じクラスのインスタンス変数 x のことを, this.x と書いたが,略記法として x とだけ書くことも許される.今回は説明 のため,"this." をつけたが通常のプログラムではつけないのが普通である.

基本クラスの動的メソッドの例

これまで出てきた,システムの基本クラス Stringクラス の動的メソッドの例を見る. compareTo(String)というメソッドは
class StTest1{
  public static void main(String[] args){
    if(args[0].compareTo("tanaka")==0){
      System.out.println("あなたはおそらく田中さんですね(棚香かも).");
    }
    else{
      System.out.println("あなたは田中さんですはありませんね");
    }
  }
}
のように,String型のインスタンス(この場合は args[0]の中に入っている文字列) に関連づけられているので動的メソッドになる.
説明の都合上静的メソッドの方を先に説明したが,実際のプログラムで使わ れるのは動的メソッドの方が多い(というか,オブジェクト指向言語に適した プログラム設計を行うと必然的にそうなる).静的メソッドが使われるのは, 以下のような場合などである.
  • 基本データ型などオブジェクト型でないものを引数とする場合.

    たとえば,以前出てきた int型の変数 x を文字列にする際に, Integer.parseInt(x) と静的メソッドを呼び出したが,int型がオブジェクト型 だったとしたら,parseIntをクラスintの動的メソッドにして x.parseInt() と 書けるようにするだろう.

  • public static void main(String[])

    プログラムをスタートする際の main メソッドは静的メソッドになっている.

ここまでの説明では,動的メソッドを導入することによるメリットとしては, 呼び出し側のプログラムが簡単に書けるという以上のことは分かっていないが, 後でやる継承(inheritance)によって,動的メソッドは静的メソッドとは質的 に違った能力を持つ.
クラス内の変数の宣言に static をつけると,クラス変数といって,そのク ラスのインスタンスを作らずに参照できる変数ができる.これまでには, Math.PIなどが出てきた.しかし,通常のプログラミングではそれほど問題に ならない.