public class t4 {
Integer x=new Integer(3);
public static void main(String[] args) {
t4 t=new t4();
t.add(t.x);
System.out.println(t.x);
} private void add(int x) {
x++;
}
}
java不是传值么,然后这个程序把t.x的应用传给add函数应该是四啊。。
求大神解答。

解决方案 »

  1.   

    我创建了一个Integer的对象,然后用t.x的引用来指向它,然后形参x来获得t.x的引用。。
      

  2.   

    就是因为传递的是值,所以t.x本身执行add方法根本不会发生改变,这种问题都讨论过多少遍了
    实际上执行add的时候,仅仅是把t.x的值拷贝了过去,在add方法执行也是把t.x的值加一,完毕 这个临时的拷贝没有用了就被内存回收
      

  3.   

    嗯,如果是一个对象也是把对象拷贝过去吗?
    还是给对象的引用拷贝过去,哦。。就是对象引用,
    我还是有点不明白为什么常用数据类型比如Int,他们不是引用呢,
    比如int x=4,x是一个引用,而4是一个Integer的对象。。
    如果x是一个引用的话,就应该是四了。。
      

  4.   


    如果是一个对象,不是把一个对象拷贝过去,而传递一个引用,这个引用指向着内存中的同一个对象。
    如果是一个int,那么如果这个int的值是3,那就直接把3传过去。
      

  5.   

    x如果是引用的话,其实是将这个对象引用拷贝,然后赋值进去,因为你用对象引用在方法里面会改变对象的值而原来的对象引用指向没有便,指向对象因为对象引用的副本的操作而发生了变化,因此看起来就是对象引用的值发生变化了,变成4这里关键要分清楚 对象 和对象引用 ,java里面从来不直接操作对象,都是操作对象的引用,对象的引用值在赋值过程当中不变其实是指引用的对象指向不变,但是引用的对象可能会因为对象引用的其他副本操作而变化其实这也是java7一直想要增加闭包,减少逻辑bug的原因之一
      

  6.   

    这个问题有点意思,LZ的问题应该改为下面的更贴切:
    public class D
    {
        public static void main(String[] args)
        {
            Integer x = new Integer(1);
            D d = new D();
            d.add(x);
            System.out.println(x);
        }
        
        private void add(Integer x)
        {
            x++;
        }
    }解答为:
    Integer是不可变对象,你并没有改变你传进去的Integer对象(如何改变?调用这个对象上的方法或者给该对象上的字段赋值)