つながったオブジェクトを表示する

オブジェクトの操作を行うまえに、表示のためのメソッドを作っておきます。

１つのオブジェクトを表示する

オブジェクトのアドレス(と種類)を表示するには、 オブジェクトを指している変数の値をprintすればよい。

ここで

System.out.println(a);

の代わりに

a.show();

と書けるようにするには、つぎのようなshowメソッドを定義すればよい。

void show(){ System.out.println(this);}

どこも参照していないときの値

Chainクラスのインスタンスはこのような形をしています。

変数nextがどこも参照していないときは、どんな値をとればよいのでしょうか。

この値は

null

と決められており、オブジェクト型の変数が作られたときは、 nullで自動的に初期化されます。

次のようなプログラムを実行して確かめることができます。

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が先頭のインスタンスを指している場合です。

cが指しているインスタンスを表示するには、１つのオブジェクトを表示するメソッドshow()を使えばよい。

c.show();

2. ２番目のインスタンスに移る。

先頭のインスタンスの処理(表示)が終わったら、c が次のインスタンスを指すように修正します。

上の図から次の図になるようにcの値を修正します。

c.nextが指していたものを、cが指すようにすればよいので次のように書けます。

c = c.next;

3. 繰り返しの内容。

したがってインスタンスがつながっているときは、1,2の処理を繰り返して行えばよいと考えられる。

while (条件){ c.show(); c = c.next;}

4. いちばん後ろのインスタンスの処理。

3で考えた繰り返しの内容を、いちばん後ろのインスタンスで行った場合にどうなるか考えます。

c.show();

cが指している(いちばん後ろの)インスタンスが表示されます。

c = c.next;

いちばん後ろのインスタンスのnextには値null が入っています。

c.nextにnullが入っていたので、代入が行われると次のようになります。

5. 繰り返しの条件を考える。

上で考えたことから繰り返しの条件は次のようになる。

cがインスタンスを指していれば処理を続ける。

cがnullなら処理を終わる。

これを書き加えると繰り返し部分はこのようになる。

while (c != null){ c.show(); c = c.next;}

showAllメソッドを書く

次の処理を書き加えて完成。

変数 c の初期化

最初に ( を表示

最後に ) を表示

void showAll()
{
Chain c;
c = this;
System. out. println( "(");
while ( c != null)
{
c. show();
c = c. next;
}
System. out. println( ")");
}

正しく動作するか考える

変数aが次のようなオブジェクトを参照しているときに

a.showAll()

が呼ばれた場合の動作を追ってみましょう。