== つながったオブジェクトを表示する == オブジェクトの操作を行うまえに、表示のためのメソッドを作っておきます。 ---- === 1つのオブジェクトを表示する === オブジェクトのアドレス(と種類)を表示するには、 オブジェクトを指している変数の値をprintすればよい。 ここで {{{ System.out.println(a); }}} の代わりに {{{ a.show(); }}} と書けるようにするには、つぎのようなshowメソッドを定義すればよい。 {{{ void show() { System.out.println(this); } }}} ---- === どこも参照していないときの値 === Chainクラスのインスタンスはこのような形をしています。 . {{attachment:chain2.png}} 変数nextがどこも参照していないときは、どんな値をとればよいのでしょうか。 この値は . null と決められており、オブジェクト型の変数が作られたときは、 nullで自動的に初期化されます。 次のようなプログラムを実行して確かめることができます。 {{{#!java public static void main(String[] args) { Chain a; a = new Chain(); System.out.println(a.next); } }}} 実行すると {{{ null }}} と表示されます。 ---- === つながったオブジェクトを表示する === showAllという名前のメソッドを作成します。 変数aがChainインスタンスを指しており、 そのインスタンスの変数nextがまた別のChainインスタンスを指しているような場合に {{{ a.showAll(); }}} とすることで、つながっているChainインスタンスをすべて表示するものです。 * Chainインスタンスがつながっている個数は決まっていません。 * 一番後ろのChainインスタンスの変数nextの値はnullになっています。 ---- === showAllメソッド内での処理を考える === いくつものインスタンスを表示するためには、 変数を使ってインスタンスをたどっていく必要があります。 . このために 変数 c を使うことにします。 1. 先頭のインスタンスを表示。 . cが先頭のインスタンスを指している場合です。 . {{attachment:chain7.png}} . cが指しているインスタンスを表示するには、1つのオブジェクトを表示するメソッドshow()を使えばよい。 {{{ c.show(); }}} 2. 2番目のインスタンスに移る。 . 先頭のインスタンスの処理(表示)が終わったら、c が次のインスタンスを指すように修正します。 . 上の図から次の図になるようにcの値を修正します。 . {{attachment:chain8.png}} . c.nextが指していたものを、cが指すようにすればよいので次のように書けます。 {{{ c = c.next; }}} 3. 繰り返しの内容。 . したがってインスタンスがつながっているときは、1,2の処理を繰り返して行えばよいと考えられる。 {{{ while (条件) { c.show(); c = c.next; } }}} 4. いちばん後ろのインスタンスの処理。 . 3で考えた繰り返しの内容を、いちばん後ろのインスタンスで行った場合にどうなるか考えます。 . {{attachment:chain9.png}} * c.show(); . cが指している(いちばん後ろの)インスタンスが表示されます。 * c = c.next; . いちばん後ろのインスタンスのnextには値'''null'''が入っています。 . c.nextにnullが入っていたので、代入が行われると次のようになります。 . {{attachment:chain10.png}} 5. 繰り返しの条件を考える。 . 上で考えたことから繰り返しの条件は次のようになる。 * cがインスタンスを指していれば処理を続ける。 * cがnullなら処理を終わる。 . これを書き加えると繰り返し部分はこのようになる。 {{{ while (c != null) { c.show(); c = c.next; } }}} ---- === showAllメソッドを書く === 次の処理を書き加えて完成。 . 変数 c の初期化 . 最初に ( を表示 . 最後に ) を表示 {{{#!java void showAll() { Chain c; c = this; System.out.println("("); while (c != null) { c.show(); c = c.next; } System.out.println(")"); } }}} ---- === 正しく動作するか考える === 変数aが次のようなオブジェクトを参照しているときに . a.showAll() が呼ばれた場合の動作を追ってみましょう。 . {{attachment:chain6.png}}