标签:ati out ring main soft code 赋值 对象 system
public class Test { public static void main(String[] args) { Integer g=10; f(g); System.out.println(g); } private static void f(Integer g) { g=30; } }
为什么这里输出的是10?
当执行g=30的时候,会先在栈里查找30,如果有,返回这个对象x,如果没有,则创建,然后返回对象x,最终g指向x的地址。
或者这样来解释更容易理解:
g=30;
等价于
g = new Integer(30); 自动装包
这个时候方法f里面的g指向的地址和main里面的g指向的地址已经不一样了。
public class Test { public static void main(String[] args) { Integer g=10; f(g); System.out.println(g); } private static void f(Integer g) { Integer k=30; g=k; } }
乍看之下,输出的结果应该是30,但其实还是输出10;
理由和上面的一样。
不过,需要补充的一点是以下方法中的g的生命周期只在该方法体有效,
private static void f(Integer g) { Integer k=30; g=k; }
也就说说g=30只在该方法里有效,如果,f()方法里的g和main方法的g指向同一个对象,则方法f()中改变g的值,那么main()方法的g也会变,但,那是不可能的,只要g在f()方法中赋值,那么该g就指向了另个对象了。和main方法中的g就不是同一个了。可以这样改造:
public class GGG { public static void main(String[] args) { GGG ggg = new GGG(); T t = ggg.new T(); f(t); System.out.println(t.g); } private static void f(T t) { t.g = 30; } private class T { Integer g = 10; } }
涉及的知识点,有两个:
1.引用类型
2.生命周期
标签:ati out ring main soft code 赋值 对象 system
原文地址:http://www.cnblogs.com/H-BolinBlog/p/6210822.html