| 
  
   サイズ: 3750 
  
  コメント:  
 | 
    ← 2010-11-17 00:30:43時点のリビジョン16  ⇥ 
  サイズ: 4683 
  
  コメント:  
 | 
| 削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 | 
| 行 1: | 行 1: | 
| #acl All: | |
| 行 98: | 行 97: | 
| . 3で考えた繰り返しの内容を、いちばん後ろのインスタンスで行った場合にどうなるか考えます。 | |
| 行 99: | 行 99: | 
|  * 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 の初期化 . 最初に ( を表示 . 最後に ) を表示  | 
|
| 行 100: | 行 124: | 
|  {{{#!java void showAll() { Chain c; c = this; System.out.println("("); while (c != null) { c.show(); c = c.next; } System.out.println(")"); } }}}  | 
|
| 行 101: | 行 140: | 
| === 正しく動作するか考える === | |
| 行 103: | 行 143: | 
| が呼ばれた場合の動作を考えます。 | が呼ばれた場合の動作を追ってみましょう。 | 
| 行 105: | 行 145: | 
| メソッドが呼ばれると、呼び出し元の変数の値がthisに渡されます。 . ここではaの値がthisに渡されるのでthisはaが指していたのとおなじオブジェクトを指します。 先に作成した1つのオブジェクトを表示するメソッドshow()  | 
つながったオブジェクトを表示する
オブジェクトの操作を行うまえに、表示のためのメソッドを作っておきます。
1つのオブジェクトを表示する
オブジェクトのアドレス(と種類)を表示するには、 オブジェクトを指している変数の値をprintすればよい。
ここで
System.out.println(a);
の代わりに
a.show();
と書けるようにするには、つぎのようなshowメソッドを定義すればよい。
void show() { System.out.println(this); }
どこも参照していないときの値
Chainクラスのインスタンスはこのような形をしています。
変数nextがどこも参照していないときは、どんな値をとればよいのでしょうか。
この値は
- null
 
と決められており、オブジェクト型の変数が作られたときは、 nullで自動的に初期化されます。
次のようなプログラムを実行して確かめることができます。
実行すると
null
と表示されます。
つながったオブジェクトを表示する
showAllという名前のメソッドを作成します。
変数aがChainインスタンスを指しており、 そのインスタンスの変数nextがまた別のChainインスタンスを指しているような場合に
a.showAll();
とすることで、つながっているChainインスタンスをすべて表示するものです。
- Chainインスタンスがつながっている個数は決まっていません。
 - 一番後ろのChainインスタンスの変数nextの値はnullになっています。
 
showAllメソッド内での処理を考える
いくつものインスタンスを表示するためには、 変数を使ってインスタンスをたどっていく必要があります。
- このために 変数 c を使うことにします。
 
1. 先頭のインスタンスを表示。
- cが先頭のインスタンスを指している場合です。
 
 - cが指しているインスタンスを表示するには、1つのオブジェクトを表示するメソッドshow()を使えばよい。 
c.show();
 
2. 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 の初期化
 - 最初に ( を表示
 - 最後に ) を表示
 
正しく動作するか考える
変数aが次のようなオブジェクトを参照しているときに
- a.showAll()
 
が呼ばれた場合の動作を追ってみましょう。
