next up previous
: 継承 : オブジェクト指向プログラミング と 並行プログラミング : オブジェクト指向言語

オブジェクト指向言語 Java

現在,代表的なオブジェクト指向言語 Java は,ゴスリン(米国サン・マイク ロシステムズ社) によって提案された言語である.ゴスリンによって研究され ていた当時は Oak といわれていた.

オブジェクト指向言語 Java は,「クラスベース」であるためクラスを定義す ることにより,プログラミングする.最初に,オブジェクト指向言語で説明し た例題を Java により定義してみよう.「オブジェクト指向」とは,最初に説 明したように「概念」であるため,前節で定義した抽象化されたクラスを プログラミングの際に「具体化」する必要がある.この具体化は,各プログラマの 責任である.そのため,以下で定義するプログラムは,筆者の解 釈 であると考 えてよい4

public class Person {
  private int AirplaneColor,AirplaneSpeed;
  private boolean TreeStatus;
  private Airplane knownAirplane;
  private Tree knownTree;
  Person(Tree t,Airplane a) {
    knownTree = t; knownAirplane = a;
  }
  public void Seeing() {
    TreeStatus=knownTree.WhatIsYourStatus();
    AirplaneSpeed=
      knownAirplane.WhatIsYourSpeed();
    AirplaneColor=
      knownAirplane.WhatIsYourColor();
    System.out.println(
      "TStatus: "+TreeStatus+
      ",ASpeed: "+AirplaneSpeed+",AColor: "+
      Color.toString(AirplaneColor));
  }
  public static void main(String args[]) {
    Tree t = new Tree();
    Airplane a = new Airplane(t);
    Person p = new Person(t,a);
    for(int i=0;i<21;i++) {
      for(int j=0;j<10000;j++){}      
      p.Seeing(); a.Flying();
    }
    p.Seeing();
  }
}
class Color {
  static int White=0,Red=1,Green=2,Blue=4;
  static String toString(int Col) {
    switch(Col) {
      case 0: return "White";
      case 2: return "Read";
      case 4: return "Green";
      case 8: return "Blue";
      default: return "unknownColor";
    }
  }
}
class Airplane {
  private int Speed,Col = Color.White;
  private Tree knownTree;
  private boolean Upper=true;
  Airplane(Tree t) {
    knownTree = t;
  }
  public void Flying() {
    if(Upper==true) {
      if(Speed++==9) Upper=false;
    } else
      if(--Speed<=0) Speed=0;
    if(Speed>0) knownTree.Wind();
    else knownTree.stopWind();
  }
  public int WhatIsYourSpeed() {
    return Speed;
  }
  public int WhatIsYourColor() {
    return Col;
  }
}
class Tree {
  private boolean Status = false;
  public boolean WhatIsYourStatus() {
    return Status;
  }
  public void Wind() {
    Status = true;
  }
  public void stopWind() {
    Status = false;
  }
}
このプログラムを実行すると以下のようになる.
TStatus: false,ASpeed: 0,AColor: White
TStatus: true,ASpeed: 1,AColor: White
TStatus: true,ASpeed: 2,AColor: White
TStatus: true,ASpeed: 3,AColor: White
TStatus: true,ASpeed: 4,AColor: White
TStatus: true,ASpeed: 5,AColor: White
TStatus: true,ASpeed: 6,AColor: White
TStatus: true,ASpeed: 7,AColor: White
TStatus: true,ASpeed: 8,AColor: White
TStatus: true,ASpeed: 9,AColor: White
TStatus: true,ASpeed: 10,AColor: White
TStatus: true,ASpeed: 9,AColor: White
TStatus: true,ASpeed: 8,AColor: White
TStatus: true,ASpeed: 7,AColor: White
TStatus: true,ASpeed: 6,AColor: White
TStatus: true,ASpeed: 5,AColor: White
TStatus: true,ASpeed: 4,AColor: White
TStatus: true,ASpeed: 3,AColor: White
TStatus: true,ASpeed: 2,AColor: White
TStatus: true,ASpeed: 1,AColor: White
TStatus: false,ASpeed: 0,AColor: White
TStatus: false,ASpeed: 0,AColor: White

では,順次説明してみよう.Java では,前節で説明した「メッセージの受渡 し」は,メソッド呼出しとなる.クラスより生成されたインスタンス(オブ ジェクト) のメソッドを通常の手続き呼出しのように呼出す.例えば, クラス Airplane のメソッド Flying() の定義の中での,

knownTree.Wind();
は,
この飛行機が知っている木に Wind()(風の意味) というメッセージを受渡したことと同じである.

前節に無かった定義では,各クラスは コンストラクタ(constructor) という部分を持っている.例えば,クラ ス Person では,

Person(Tree t,Airplane a) {
  knownTree = t; knownAirplane = a;
}
となっている.
このコンストラクタは, new によりクラス Person からインスタンス(オブジェクト)を生成する場合に,一度だけ 呼出される部分である.ここでは,クラス Person からインスタンス が生成(いわゆる人間が一人)される時,そのインスタンスへ,(見るべき)木と 飛行機を教えている.

各クラスの状態と,メソッドの宣言は,以下のようになっている.

クラス 状態 メソッド
Person AirPlaneColor Seeing()
AirPlaneSpeed
TreeStatus
knownTree
Airplane Speed Flying()
Col WhatIsYourSpeed()
knownTree WhatIsYourColor()
Upper
Tree Status WhatIsYourStatus()
Wind()
stopWind()

全体を統括するメソッド main は,クラス Person の中で定義されているが,特別な意味を持つので (特に Person の中でなくてもよい), static として定義する.

  public static void main(String args[]) {
    Tree t = new Tree();
    Airplane a = new Airplane(t);
    Person p = new Person(t,a);
    for(int i=0;i<21;i++) {
      for(int j=0;j<10000;j++){}
      p.Seeing(); a.Flying();
    }
    p.Seeing();
  }
これより,全体の処理の流れは,
  1. クラス Tree よりインスタンス tを生成する.
  2. クラス Airplane よりインスタンス aを生成する.
  3. クラス Person よりインスタンス pを生成する.
  4. 以下の処理を 21 回繰り返す.この間に飛行機は速度を増し,やがて減 速し,止まる.
    1. 数秒待つ.
    2. 人間 pにメッセージ「見る」を受渡す.
    3. 飛行機 aにメッセージ「飛べ」を受渡す.
  5. 最後にもう一度,人間 p にメッセージ「見る」を受渡す.

Java では,前に定義した仮想的な言語と異なり「実際に実行させる」必要が あるので,このように「全体を統括する」プログラムが必要となる. しかし,他の「クラス定義」の部分は,全く同様に定義することができた.



next up previous
: 継承 : オブジェクト指向プログラミング と 並行プログラミング : オブジェクト指向言語
平成12年8月9日