日期:2014-05-20  浏览次数:21053 次

Integer是引用类型不
public class Test {
public static void main(String[] args) {
Integer g=10;
f(g);
System.out.println(g);
}

private static void f(Integer g) {
// TODO Auto-generated method stub
g=30;
}
}
为什么这里输出的是10;
请问Integer,Double,String等是不是作为基本类型,不是引用类型啊。

------解决方案--------------------
String在api的源码中是定义的final型的,Integer这些你赋值的时候,虽然没有代码来转换成int,其实编译器在编译的时候已经自动为你加上了转换的代码
------解决方案--------------------

public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }

这是源码,赋值的时候调的是这个方法,返回值是新new出来的对象
------解决方案--------------------
引用:
Quote: 引用:

String在api的源码中是定义的final型的,Integer这些你赋值的时候,虽然没有代码来转换成int,其实编译器在编译的时候已经自动为你加上了转换的代码

按你的说法是编译器帮实例了一个对象,
再把新实例的对象赋给他。
也就是我们不能像其他的对象一样传递引用改变他的值。


Integer是引用类型,是int型数据的包装类。

实质上,你说的是对的,当执行g=30的时候,会先在栈里查找30,如果有,返回这个对象x,如果没有,则创建,然后返回对象x,最终g指向x的地址。
------解决方案--------------------
或者这样来解释更容易理解:

g=30;
等价于
g = new Integer(30); 自动装包

这个时候方法f里面的g指向的地址和main里面的g指向的地址已经不一样了。


------解决方案--------------------
很简单啊。这两个g指向的地址是不一样的啦。
无论你怎么在f函数里面改变,Main函数里面的g永远指向10。你又没有改变Main函数里面的g指向的对象。
你不妨输出f(g)试试。应该是30无误。或者Main中f(g)改为g=f(g),这样也能输出30。
------解决方案--------------------
1.跟Integer和int没关系,你这个程序中在main方法里面定义了局部对象Integer,所以打印出来的是局部变量的值,你变成int同样是这样。
2.你如果把 Integer g 放在main方法的外面,eclipse会提示要变成static才合理。
package csdn.programbbs_530;
//输出:10 100
public class Test {
public static void main(String[] args) {
Integer g = 10;
f(g);
System.out.println(g);

int a = 100;
g(a);
System.out.println(a);
}

private static void f(Integer g) {
g = 30;
}

private static void g(int a) {
a = 300;
}

}

------解决方案--------------------
这个跟你的程序写错了有关,用一个错误的问题是不可能得到一个正确的答案的。可以变成:
package csdn.programbbs_530;
/*
 * 输出:30 300
 */
public class Test {
public static void main(String[] args) {
Integer g = 10;