您的位置:首页 > 编程语言 > Java开发

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

2011-04-25 08:32 148 查看
使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: