码迷,mamicode.com
首页 > 其他好文 > 详细

引用类型问题

时间:2016-12-22 14:44:25      阅读:135      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!