new Calc(7, 3).divInt() のトレース とりあえず, new Calc(7,3) ,new Calc(4,3) ,new Calc(1,3) で作成されるインスタンスを, それぞれ,i73, i43, i13 とという名前で参照するとする. 問題として与えられたプログラム Calc.java を使い, java Calc 7 3 を実行することで,new Calc(7, 3).divInt() が実行されたと仮定する. =========================================================================== mainのトレース local=[args, x, y, r] stack=[] aload_0 iconst_0 local=[args, x, y, r] stack=[args, 0] aaload ; 配列 args のゼロ番目の要素を取り出す local=[args, x, y, r] stack=["7"] invokestatic java/lang/Integer/parseInt(Ljava/lang/String;)I ; 数字に変換 local=[args, x, y, r] stack=[7] istore_1 local=[args, 7, y, r] stack=[] aload_0 iconst_1 local=[args, 7, y, r] stack=[args, 1] aaload ; 配列 args の一番目の要素を取り出す local=[args, 7, y, r] stack=["3"] invokestatic java/lang/Integer/parseInt(Ljava/lang/String;)I ; 数字に変換 local=[args, 7, y, r] stack=[3] istore_2 local=[args, 7, 3, r] stack=[] new Calc ; Calcのインスタンス (i73) を作成 local=[args, 7, 3, r] stack=[i73] dup ; 複製を作る local=[args, 7, 3, r] stack=[i73, i73] iload_1 iload_2 local=[args, 7, 3, r] stack=[i73, i73, 7, 3] invokespecial Calc/(II)V ; i73.(7,3) に飛ぶ. local=[args, 7, 3, r] stack=[i73] invokevirtual Calc/divInt()I ; i73.divInt() に飛ぶ. local=[args, 7, 3, r] stack=[2] istore_3 local=[args, 7, 3, 2] stack=[] getstatic java/lang/System/out Ljava/io/PrintStream; ; 標準出力オブジェクトを取得 local=[args, 7, 3, 2] stack=[out] iload_3 local=[args, 7, 3, 2] stack=[out, 2] invokevirtual java/io/PrintStream/println(I)V ; out に対して引数2にてprintlnメソッドを呼び出し local=[args, 7, 3, 2] stack=[] return ; おしまい =========================================================================== i73.(7,3) のトレース (this=i73) local=[this, 7, 3] stack=[] aload_0 local=[this, 7, 3] stack=[this] nvokespecial java/lang/Object/()V ; スーパークラスのコンストラクタを呼ぶ local=[this, 7, 3] stack=[] aload_0 iload_1 local=[this, 7, 3] stack=[this, 7] putfield Calc/x I ; i73.x=7 local=[this, 7, 3] stack=[] aload_0 iload_2 local=[this, 7, 3] stack=[this, 3] putfield Calc/y I ; i73.y=3 local=[this, 7, 3] stack=[] return =========================================================================== i73.divInt() のトレース (this=i73) local=[this] stack=[] aload_0 getfield Calc/x I ; i73.x の値を取り出す local=[this] stack=[7] aload_0 getfield Calc/y I ; i73.y の値を取り出す local=[this] stack=[7, 3] if_icmpge Label1 ; 7>=3 なら Label1に飛ぶ local=[this] stack=[] new Calc ; ココで i43が作成される local=[this] stack=[i43] dup local=[this] stack=[i43, i43] aload_0 local=[this] stack=[i43, i43, this=i73] getfield Calc/x I ; i73.xを取り出す local=[this] stack=[i43, i43, 7] aload_0 local=[this] stack=[i43, i43, 7, this=i73] getfield Calc/y I ; i73.yを取り出す local=[this] stack=[i43, i43, 7, 3] isub ; 7-3 local=[this] stack=[i43, i43, 4] aload_0 getfield Calc/y I local=[this] stack=[i43, i43, 4, 3] invokespecial Calc/(II)V ; i43.(4,3) に飛ぶ local=[this] stack=[i43] invokevirtual Calc/divInt()I ; i43.divInt() に飛ぶ local=[this] stack=[1] iconst_1 local=[this] stack=[1, 1] iadd local=[this] stack=[2] ireturn ; 返り値として2が返ります =========================================================================== i43.(4,3)のトレース (this=i43) local=[this, 4, 3] stack=[] aload_0 local=[this, 4, 3] stack=[this] nvokespecial java/lang/Object/()V ; スーパークラスのコンストラクタを呼ぶ local=[this, 4, 3] stack=[] aload_0 iload_1 local=[this, 4, 3] stack=[this, 4] putfield Calc/x I ; i43.x=4 local=[this, 4, 3] stack=[] aload_0 iload_2 local=[this, 4, 3] stack=[this, 3] putfield Calc/y I ; i43.y=3 local=[this, 4, 3] stack=[] return =========================================================================== i43.divInt() のトレース (this=i43) local=[this] stack=[] aload_0 getfield Calc/x I ; i43.x の値を取り出す local=[this] stack=[4] aload_0 getfield Calc/y I ; i43.y の値を取り出す local=[this] stack=[4, 3] if_icmpge Label1 ; 4>=3 なら Label1に飛ぶ local=[this] stack=[] new Calc ; ココで i13が作成される local=[this] stack=[i13] dup local=[this] stack=[i13, i13] aload_0 local=[this] stack=[i13, i13, this=i43] getfield Calc/x I ; i43.xを取り出す local=[this] stack=[i13, i13, 4] aload_0 local=[this] stack=[i13, i13, 4, this=i43] getfield Calc/y I ; i43.yを取り出す local=[this] stack=[i13, i13, 4, 3] isub ; 4-3 local=[this] stack=[i13, i13, 1] aload_0 getfield Calc/y I local=[this] stack=[i13, i13, 1, 3] invokespecial Calc/(II)V ; i13.(1,3) に飛ぶ local=[this] stack=[i13] invokevirtual Calc/divInt()I ; i13.divInt() に飛ぶ local=[this] stack=[0] iconst_1 local=[this] stack=[0, 1] iadd local=[this] stack=[1] ireturn ; 返り値として1が返ります =========================================================================== i13.(1,3) のトレース (this=i13) local=[this, 1, 3] stack=[] aload_0 local=[this, 1, 3] stack=[this] nvokespecial java/lang/Object/()V ; スーパークラスのコンストラクタを呼ぶ local=[this, 1, 3] stack=[] aload_0 iload_1 local=[this, 1, 3] stack=[this, 1] putfield Calc/x I ; i13.x=1 local=[this, 1, 3] stack=[] aload_0 iload_2 local=[this, 1, 3] stack=[this, 3] putfield Calc/y I ; i13.y=3 local=[this, 1, 3] stack=[] return =========================================================================== i13.divInt() のトレース (this=i13) local=[this] stack=[] aload_0 getfield Calc/x I ; i13.x の値を取り出す local=[this] stack=[1] aload_0 getfield Calc/y I ; i13.y の値を取り出す local=[this] stack=[1, 3] if_icmpge Label1 ; 1>=3 ではないので Label1に飛ばない. local=[this] stack=[] iconst_0 local=[this] stack=[0] ireturn ; 返り値として0が返ります ===========================================================================