使用javap分析finally块中return值(续1)

使用javap分析finally块中return值(续1

 

作者:pwsource

邮箱:pwsource@gmail.com

说明:《使用javap分析finally块中return》文章的续篇

描述: java应用类型的分析。

 

正文:

 

testInteger()  x引用的对象有变化,修改的是x引用的对象。在try块,将x->Integer(0)修改为x->Integer(1); finally块,将x->Integer(1)修改为x->Integer(2)return前拷贝的是x,此时x->Integer(1),return返回x的拷贝,此时x-> Integer(1)

testRef() ref引用的对象始终没有变化,修改的是引用的对象的成员变量x。在try块,将(ref->Ref).x=null修改(ref->Ref).x=1; finally块将(ref->Ref).x=1修改(ref->Ref).x=2 return前拷贝的是ref,此时ref->Ref return返回的是ref的拷贝,此时ref->Ref的成员变量x等于2注意,拷贝前、拷贝后和finally中使用的变量都是ref,它始终引用同一个实例, 所以Ref.x的值会改变。

 

总结,对于引用型变量,return返回前对该类型变量进行了变量拷贝,return返回时使用的是该变量的拷贝;对于基本类型(int longdouble等),return返回前对该类型的变量进行值拷贝,return返回时使用的是变量值的拷贝。

 

 

public class Integer_test

{

    public static Integer testInteger()

    {

       Integer x = new Integer(0);

       try

       {

           x = new Integer(1);

           return x;

       }

       finally

       {

           x = new Integer(2);

       }

    }

 

    public static Ref testRef()

    {

       Ref ref = new Ref();

       try

       {

           ref.x = 1;

           return ref;

       }

       finally

       {

           ref.x = 2;

       }

    }

   

    public static void main(String[] args)

    {

       System.out.println(testInteger().toString());

       System.out.println(testRef().toString());

    }

   

    private static class Ref

    {

       private int x;

 

       public String toString()

       {

           return String.valueOf(x);

       }

 

    }

}

 

 

 

E:/>javap -c -classpath E:/workspace/myTest/bin test.Integer_test

Compiled from "Integer_test.java"

public class test.Integer_test extends java.lang.Object{

public test.Integer_test();

  Code:

   0:   aload_0

   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V

   4:   return

 

public static java.lang.Integer testInteger();

  Code:

   0:   new     #16; //class java/lang/Integer

   3:   dup

   4:   iconst_0

   5:   invokespecial   #18; //Method java/lang/Integer."<init>":(I)V

   8:   astore_0

   9:   new     #16; //class java/lang/Integer

   12:  dup

   13:  iconst_1

   14:  invokespecial   #18; //Method java/lang/Integer."<init>":(I)V

   17:  astore_0

   18:  aload_0

   19:  astore_3

   20:  jsr     31

   23:  aload_3

   24:  areturn

   25:  astore_2

   26:  jsr     31

   29:  aload_2

   30:  athrow

   31:  astore_1

   32:  new     #16; //class java/lang/Integer

   35:  dup

   36:  iconst_2

   37:  invokespecial   #18; //Method java/lang/Integer."<init>":(I)V

   40:  astore_0

   41:  ret     1

  Exception table:

   from   to  target type

     9    23    25   any

 

public static test.Integer_test$Ref testRef();

  Code:

   0:   new     #25; //class test/Integer_test$Ref

   3:   dup

   4:   aconst_null

   5:   invokespecial   #27; //Method test/Integer_test$Ref."<init>":(Ltest/Integer_test$Ref;)V

   8:   astore_0

   9:   aload_0

   10:  iconst_1

   11:  invokestatic    #30; //Method test/Integer_test$Ref.access$1:(Ltest/Integer_test$Ref;I)V

   14:  aload_0

   15:  astore_3

   16:  jsr     27

   19:  aload_3

   20:  areturn

   21:  astore_2

   22:  jsr     27

   25:  aload_2

   26:  athrow

   27:  astore_1

   28:  aload_0

   29:  iconst_2

   30:  invokestatic    #30; //Method test/Integer_test$Ref.access$1:(Ltest/Integer_test$Ref;I)V

   33:  ret     1

  Exception table:

   from   to  target type

     9    19    21   any

 

public static void main(java.lang.String[]);

  Code:

   0:   getstatic       #38; //Field java/lang/System.out:Ljava/io/PrintStream;

   3:   invokestatic    #44; //Method testInteger:()Ljava/lang/Integer;

   6:   invokevirtual   #46; //Method java/lang/Integer.toString:()Ljava/lang/String;

   9:   invokevirtual   #50; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

   12:  getstatic       #38; //Field java/lang/System.out:Ljava/io/PrintStream;

   15:  invokestatic    #56; //Method testRef:()Ltest/Integer_test$Ref;

   18:  invokevirtual   #58; //Method test/Integer_test$Ref.toString:()Ljava/lang/String;

   21:  invokevirtual   #50; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

   24:  return

 

}

 

 

 

运行结果:

1

2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值