书上说Integer是不可变的,一旦构造,就不许更改包装在其中的值,也不能用包装器类实现修改数值参数的方法,但是又说Integer对象在算术表达式中会自动的打包和拆包,例如Integer n = 3;n++;编译器将自动插入一条拆开对象的指令,然后进行自增运算,最后再将结果打入对象包内。  但是既然对象参数是引用传递,如果在方法内部用自增运算,应该还是能够改变对象原始的Integer对象吧,可是我写了如下代码,结果testInt = 3,   result = 4
为什么testInt没有改变呢?public class FinalInteger 
{
public static void main(String[] args)
{
Integer testInt = 3;
Integer result = change(testInt);
System.out.println("testInt = " + testInt + "\nresult = " + result);

}

static Integer change(Integer x)
{
Integer y = ++x;
return y;
}}

解决方案 »

  1.   

    单独执行Integer x = 3;x++;后x=4,x指向了新的Integer对象4,但是在方法中执行x++后,x为什么没有指向4呢?
      

  2.   

    上面那位的意思是,testInt是对象。有一个指向他的引用。
    static Integer change(Integer x)
    {
    Integer y = ++x;
    return y;
    }
    里面发生了testInt的引用传递给x,Y是对象,是新建的对象,他本身有不同于testInt的引用。、
    Integer y = ++x;这一步,并不是将引用传递,是值传递。返回的是对象,是引用。。
      

  3.   

    1.8大基本类型在传递时 是 值传递 
    2.所有对象类型传递时  是 引用传递
    3.而8大基本类型的包装类和String类型是有对象池的概念的,并且改变值的时候改变的并不是对象内的值,改变的是对象指向的地址,所以在方法内部形参改变值时,改变是方法内对象的指向,并未改变传入的那个对象的地址内的值,所以不会有变化
    4.其他的对象类型均可以在引用传递时改变对象本身