先日のプログラムを順に追ってみる
どんな動きをしていたのか、少し追いかけてみることにする。
先日の記事id:regasuie:20060206:1139215946
c:\>java GcQuiz
- ClassA型のインスタンス「ジマイマ」を作成、クラス変数「q」より参照
- インスタンス変数「r」を宣言。GcQuiz型インスタンスが作成される際にClassA型のインスタンス「レベッカ」が作成される
- ClassA型のインスタンス「ミトン」を作成、ローカル変数「a」より参照
- ClassA型のインスタンス「トム」を作成、ローカル変数「b」より参照
- ClassA型のインスタンス「モペット」を作成、ローカル変数「c」より参照
- ClassB型の配列「arrayA」を宣言、配列要素は4
- 変数「b」に変数「c」を代入、これによりインスタンス「トム」はガーベッジとなる
- ClassB型のインスタンス「犬0」が作成され、arrayA[0]に代入される
- ClassB型のインスタンス「犬1」が作成され、arrayA[1]に代入される
- ClassB型のインスタンス「犬2」が作成され、arrayA[2]に代入される
- ClassB型のインスタンス「犬3」が作成され、arrayA[3]に代入される
- arrayA[3]の変数「friend」にarrayA[3]を代入する
- arrayA[0]にarrayA[1]を代入、これによりインスタンス「犬0」はガーベッジとなる
- 変数cにarrayA[2]を代入
- ClassA型の変数「d」にarrayA[0]を代入
- ClassB型の配列「arrayB」を宣言、配列要素は4
- ClassB型のインスタンス「プロプシー,ClassA型のインスタンス「野ネズミ」」を作成、arrayB[0]に代入
- ClassB型のインスタンス「モプシー,ClassA型のインスタンス「ナトキン」」を作成、arrayB[0]に代入
- ClassB型のインスタンス「カトンテール,変数「c」」を作成、arrayB[0]に代入
- ClassB型のインスタンス「ピーター,ClassA型のインスタンス「ベンジャミン」」を作成、arrayB[0]に代入
- 配列「arrayA」の参照を消去、これによりインスタンス「犬3」はガーベッジとなる
- arrayB[0]の変数「friend」の参照を消去、それによりインスタンス「野ネズミ」はガーベッジとなる
- arrayB[1]の参照を消去、それによりインスタンス「モプシー」「ナトキン」はガーベッジとなる
- arrayB[2]の参照を消去、それによりインスタンス「カトンテール」はガーベッジとなる
- ClassB型のインスタンス「ルーシー,ClassA型のインスタンス「ティギー」」を作成、ClassB型の変数eへ代入
- 変数eの参照を消去
続けて、ClassA及びClassBのインスタンス作成時の動きも追いかけてみる。
ClassA
ClassB
こんな感じかな? 上記2つを踏まえてもう一度、処理の追跡。
c:\>java GcQuiz
- ClassA型のインスタンス「ジマイマ」を作成、クラス変数「q」より参照
- インスタンス変数「r」を宣言。GcQuiz型インスタンスが作成される際にClassA型のインスタンス「レベッカ」が作成される
- ClassA型のインスタンス「ミトン」を作成、ローカル変数「a」より参照
- ClassA型のインスタンス「トム」を作成、ローカル変数「b」より参照
- ClassA型のインスタンス「モペット」を作成、ローカル変数「c」より参照
- ClassB型の配列「arrayA」を宣言、配列要素は4
- 変数「b」に変数「c」を代入、これによりインスタンス「トム」はガーベッジとなる
- ClassB型のインスタンス「犬0」が作成され、arrayA[0]に代入される
- ClassB型のインスタンス「犬1」が作成され、arrayA[1]に代入される
- ClassB型のインスタンス「犬2」が作成され、arrayA[2]に代入される
- ClassB型のインスタンス「犬3」が作成され、arrayA[3]に代入される
- arrayA[3]のインスタンス変数「friend」にarrayA[3]を代入する
- arrayA[3].friendは「犬3」を参照することになる
- arrayA[0]にarrayA[1]を代入、これによりインスタンス「犬0」はガーベッジとなる
- 変数cにarrayA[2]を代入
- ClassA型の変数「d」にarrayA[0]を代入
- ClassB型の配列「arrayB」を宣言、配列要素は4
- ClassB型のインスタンス「プロプシー,ClassA型のインスタンス「野ネズミ」」を作成、arrayB[0]に代入
- ClassA型のインスタンス「野ネズミ」を作成する
- String型の引数「"野ネズミ"」をインスタンス変数「name」に参照させる
- ClassA型のクラス変数「last」に自身のインスタンス「野ネズミ」を参照させる
- 作成したインスタンス「野ネズミ」を引数「friend」としてClassBの引数が2つあるコンストラクタを呼び出す
- ClassAのコンストラクタを呼び出し、String型の引数「"プロプシー"」をインスタンス変数「name」に参照させる
- ClassA型のクラス変数「last」に自身のインスタンス「プロプシー」を参照させる
- ClassBのクラス変数「friend」にインスタンス「野ネズミ」を参照させる
- ClassB型のインスタンス「モプシー,ClassA型のインスタンス「ナトキン」」を作成、arrayB[0]に代入
- ClassA型のインスタンス「ナトキン」を作成する
- String型の引数「"ナトキン"」をインスタンス変数「name」に参照させる
- ClassA型のクラス変数「last」に自身のインスタンス「ナトキン」を参照させる
- 作成したインスタンス「ナトキン」を引数「friend」としてClassBの引数が2つあるコンストラクタを呼び出す
- ClassAのコンストラクタを呼び出し、String型の引数「"モプシー"」をインスタンス変数「name」に参照させる
- ClassA型のクラス変数「last」に自身のインスタンス「モプシー」を参照させる
- ClassBのクラス変数「friend」にインスタンス「ナトキン」を参照させる
- ClassB型のインスタンス「カトンテール,変数「c」」を作成、arrayB[0]に代入
- ClassB型のインスタンス「ピーター,ClassA型のインスタンス「ベンジャミン」」を作成、arrayB[0]に代入
- ClassA型のインスタンス「ベンジャミン」を作成する
- String型の引数「"ベンジャミン"」をインスタンス変数「name」に参照させる
- ClassA型のクラス変数「last」に自身のインスタンス「野ネズミ」を参照させる
- 作成したインスタンス「ベンジャミン」を引数「friend」としてClassBの引数が2つあるコンストラクタを呼び出す
- ClassAのコンストラクタを呼び出し、String型の引数「"ピーター"」をインスタンス変数「name」に参照させる
- ClassA型のクラス変数「last」に自身のインスタンス「ピーター」を参照させる
- ClassBのクラス変数「friend」にインスタンス「ベンジャミン」を参照させる
- 配列「arrayA」の参照を消去、これによりインスタンス「犬3」はガーベッジとなる
- arrayB[0]の変数「friend」の参照を消去、それによりインスタンス「野ネズミ」はガーベッジとなる
- arrayB[1]の参照を消去、それによりインスタンス「モプシー」「ナトキン」はガーベッジとなる
- arrayB[2]の参照を消去、それによりインスタンス「カトンテール」はガーベッジとなる
- ClassB型のインスタンス「ルーシー,ClassA型のインスタンス「ティギー」」を作成、ClassB型の変数eへ代入
- 変数eの参照を消去
…何かとてつもなく無駄なことまで書いてる気がしないでもないけど、気にしないことにした。
問題を解く分には作成されるインスタンスのことだけ追いかければいいだろうに…
っていうツッコミが入るかなと予想。