public class test{ public static void main (String[] args) {
test t=new test();
Integer i=new Integer(20);
System.out.println(i);
t.changevalue(i);
System.out.println(i);
    }
    public  void changevalue(Integer t){
     Integer x=new Integer(34);
     t=x;
    }
}输出:
20
20
            

解决方案 »

  1.   

    i 是指向new Integer(20)的引用,你虽然调用了函数,但是并没有改变i的引用
      

  2.   

    对啊,java是传值的,因为那个值是那个引用的拷贝,虽然拷贝所指向对象改变了但是原来那个引用却并没有改变。
    如果以传参的形式来改变的话,除非对其进行另外的封装,或放在数组里,否则无论怎么修改都不会改变原有的值的。
      

  3.   

    问题在于  你不够理解 对象和引用 
    t=x;  这句话根本不起作用.
    t = new Integer(x);你更容易理解, t 的作用域只在方法体内,出了方法体就没用了.
      

  4.   

    能改变 Integer 值的方法import java.util.*;
    import java.text.*;
    import java.lang.reflect.*;public class t
    {
    public static void main(String[] args) throws Exception{ String abc = "abc"; System.out.println(abc);
    upper(abc);
    System.out.println(abc); Integer a = 3;
    inc(a);
    System.out.println(a);
    Integer b = 3;
    System.out.println(b);
    System.out.println(3);
    }
    public static void inc(Integer abc) throws Exception
    {
    Field f = abc.getClass().getDeclaredField("value");
    f.setAccessible(true);
    f.setInt(abc,abc+1);
    }
    public static void upper(String abc) throws Exception
    {
    Field f = abc.getClass().getDeclaredField("value");
    f.setAccessible(true);
    char[] cc = (char[])f.get(abc);
    for(int i=0;i<cc.length;i++)
    if(cc[i]>='a' && cc[i]<='z')
    cc[i] = (char)(cc[i] + ('A'-'a'));
    }
    }
      

  5.   

    都胡说的!!!!没讲到点子上,难道csdn真的那么多菜鸟吗?
      

  6.   

    Integer 的确是个奇怪的东西,网上相关的信息也比较少
      

  7.   

        public  void changevalue(Integer t){
        Integer x=new Integer(34);
        t=x;
        } 
    你用这个方法 传进来  
    Integer x = 10;了
    然后  t=10;
    这是内存里面的做法
      

  8.   

    Java的传参机制就是值传. 基本数据类型是copy值,引用类型就是copy这个对象的地址.  就是说这个时候实参和形参指向同一个对象, 你方法里面让形参指向一个新对象,对实参无任何影响..  
      

  9.   

    http://blog.csdn.net/it_man/archive/2006/11/10/1376960.aspx
      

  10.   

    对不起楼上说错了
    Integer x = 34
    t=34
      

  11.   


    i的确是一个引用,不过传递的时候auto-unboxing把缓存里的值地址传过去了,是这么理解的么?
      

  12.   

    這種問題考都考過N次了,java只有值傳遞,想把方法裡的值傳出來,除非用return返回它的值,再在你想用的地方用變量接收
      

  13.   


    执行到这里时:
    public  void changevalue(Integer t){ i和t是两个引用,都指向一个对象  new Integer(20); 执行到这里时:
    Integer x=new Integer(34); 
        t=x; 
     
    引用t指向了对象 new Integer(34); 
    而引用i 还指向new Integer(20); 所以 System.out.println(i); 打印20
      

  14.   

     public  void changevalue(Integer t){ 
        Integer x=new Integer(34); 
        t=x; 

    Integer做参数的时候传递的是引用,引用i赋值给引用t,i和t是两个独立的引用,但指向同一个Integer对象A。
    你在changevalue方法中执行Integer x=new Integer(34);就创建了另一个Integer对象B及其引用x,执行t=x后,t也指向了这个对象B。但对象A内容没有变化,引用i也没有变化。
      

  15.   

    当执行t.changevalue(i);的时候,jvm自动创建了一个局部变量,假设为i1;然后把i1也指向了i指向的对象,并把i1当做参数传入,并不是传入i,此时在 changevalue方法内起作用的引用是i1,不会影响到i。
      

  16.   

    同意15楼的说话,不建议说java就是传值的,这样很容易让人产生误解(会把基本类型的传值混淆),对象做为参数,当然是传递的是该对象的引用,只不过复制了该引用的一个的拷贝,或者说不允许对改引用进行重新赋值(在C++中这样是可以的,甚至可以改变指针的偏移量,但java是不允许的),所以当改变引用的指向对象的内部状态或者属性是完全可以的例如:public class Test {
        public static void main(String[] args) {
            StringBuilder str = new StringBuilder("string");
            changeStr(str,1);// 重新赋值在改变他的状态,输出还是string
            System.out.println(str);
            changeStr(str,0);// 直接改变他的状态,输出newString
            System.out.println(str);
        }
        
        public static void changeStr(StringBuilder str,int changeFlag) {
            String newString = "newString";
            if(changeFlag == 1) {
                str = new StringBuilder(newString);  // 指向了新对象
                str.replace(0, str.length(), newString);// 改变新对象的状态,并没有影响实参对象的状态
            } else {
                str.replace(0, str.length(), newString); 
            }
        }
    }当然如果对象作为参数要改变他内部状态的话,该对象必须是mutable的,如果是String那么是无法被改变的
    Integer同样是immutable的,不过可以通过反射来改变immutable的状态