オブジェクト指向言語 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();
前節に無かった定義では,各クラスは コンストラクタ(constructor) という部分を持っている.例えば,クラ ス Person では,
Person(Tree t,Airplane a) { knownTree = t; knownAirplane = a; }
各クラスの状態と,メソッドの宣言は,以下のようになっている.
クラス | 状態 | メソッド |
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(); }これより,全体の処理の流れは,
Java では,前に定義した仮想的な言語と異なり「実際に実行させる」必要が あるので,このように「全体を統括する」プログラムが必要となる. しかし,他の「クラス定義」の部分は,全く同様に定義することができた.