第7章 クラスの作成 7.1.1 メソッドの追加 7.1 メソッド 7.1.2 メソッドと段階的なプログラム開発 7.1.3 メソッドの多重定義(オーバーロード) 7.1.4 値を返すメソッド 7.2 インスタンス変数 7.3 アクセス修飾子 7.1.1 メソッドの追加 すでに存在するクラスに機能を追加して新たなクラスを作成することは、オブジェクト指向プログ ラミングの基本的な考え方である。 これまでのプログラムでは、前に動けや右に向きを変えろといった指令していた。 a今回は多角形を描くなどの、より高度な機能を備えたタートルのクラスを定義する。 右の図の様にまず、 Turtle クラスのもつメソッドや、 インスタンス変数に加えて、int 型 n と s を引数として もらい一辺の長さ s で n 角形を描く polygon メソッド と、int 型 s を引数としてもらい一辺の長さ s で家を描 く house メソッドをもつクラス HTurtle を定義する。 1行目は、クラス HTurtle はクラス Turtle を拡張する と言う。 ここで extends の後には、一つしかクラス名を書けな いことに注意する。 public class HTurtle extends Turtle { public void polygon(int n, int s){ int a = 360/n; for(int j = 0; j < n; j++){ fd(s); rt(a); } } public void house(int s){ polygon(4,s); fd(s); rt(30); polygon(3,s); lt(30); bk(s); } } //Turtle を拡張する //polygon メソッドの定義 //曲がる角度を求めておく //n 回繰り返す // s 前に進んで // a 曲がる //house メソッドの定義 //polygon を利用 //元の場所に戻しておく 7.1.2 メソッドと段階的なプログラムの開発 複雑なメソッドを定義する場合には、一気に定義することはせずに、部品となるメソッドを定義し て、それを用いて目的のメソッドを組み立てていくのが自然である。 例えば、左下にあるプログラムのような一辺の長さ s の n 角形各辺の回りに m 角形が配置され た絵を描画するメソッド ppolygon は、 polygon メソッドを用いれば右下のように書ける。 public void ppolygon(int n, int m, int s) { TurtleFrame f = new TurtleFrame(); Turtle m = new Turtle(); f.add(m); for(int j = 0; j < n; j++){ for(int i = 0; i < m; i++){ m.fd(s); m.lt(360/m); } m.fd(s); m.rt(360/n); } } } public void ppolygon(int n, int m, int s) { for(int j = 0; j < n; j++){ polygon(m, s); m.fd(s); m.rt(360/n); } } } 7.1.3 メソッドの多重定義(オーバーロード) 一つのクラスに同じ名前で引数の個数や型の異なる複数のメソッドを定義することを多重定義 (オーバーロード)と言う。 多重定義は、親と子のクラスで定義されたメソッドの間でも可能である。 多重定義されたメソッドは同じような動作をするように定義すべきである。 メソッド呼び出し式があったとき、それが多重定義されたメソッド呼び出し式の引数の個数と型 を比較して、プログラムのコンパイル時に決定される。 (詳細は8章) 7.1.4 値を返すメソッド メソッド定義での返値の型が void 以外のメソッドは、式の意味する値を返す必要がある。 値を返すには、メソッドの最後で、 return 式 ; という文を呼び出す。この呼び出しによって、 式が評価され、その値が返される。 return 文はメソッドの最後以外のところに存在してもよく、 ある条件が成り立つときそれ以降の処理をせず終了させたいとき、 if 文の中で呼び出しを行う。 これは、返値が void のときにも用いることができ、その場合は return; という形で用いる。 7.2 インスタンス変数 インスタンス変数は個々のオブジェクトが保持する変数で、オブジェクトの状態を作り出すもの。 <例> 1 2 3 4 5 6 7 8 9 10 11 12 public class Stepper extends Turtle{ public int n; //公開されたインスタンス変数 n の宣言 public int size; //公開されたインスタンス変数 size の宣言 private int j = 0; //(非公開)インスタンス変数 j の宣言 public void step() { if(j >= n) return; //描き終えていたならすぐ終了 fd(size); rt(360/n); j++; //j の値を 1 増やす } } このようにインスタンス変数は、クラス定義の中のメソッドなどの定義のところに書き、初期値も 与えられるし、同じ型の変数を同時に複数宣言できる。 ここで、インスタンス変数の先頭に public , private の修飾子がついているがこの詳細は 7.3 節 7.3 アクセス修飾子 クラス、メソッド、フィールドなどの宣言の先頭に public や private などのアクセス修飾子を付けて きた。これらはそれらにどこからアクセスできるのか、制限する役割を果たしている。 プログラム中のクラス、メソッド、フィールドなどは、同じパッケージに存在するプログラムからアク セス可能なのが自然で、 java ではアクセス修飾子がついていなければアクセス許可の意味。 public と指定されていれば、その要素がパッケージ外のプログラムに対し公開されていることを 意味し、パッケージ外からでもアクセス可能。 private と指定されていれば、パッケージ内の他のクラスからも閉ざされ、そのクラスの中からのみ アクセス可能。
© Copyright 2024 ExpyDoc