请看下面的代码:
public class Swap {
    public static void changeInt(int i){
       i = i+1 ;
       System.out.println(i);
    }
    public static void main(String[] argc) {
       int k= 10 ;
       System.out.println(k);
       changeInt(k);
       System.out.println(k);
    }
}结果是
10
11
10
这个我能理解但是我把代码改成(int k= new Integer(10)处改变)
public class Swap {
    public static void changeInt(int i){
       i = i+1 ;
       System.out.println(i);
    }
    public static void main(String[] argc) {
       int k= new Integer(10) ;
       System.out.println(k);
       changeInt(k);
       System.out.println(k);
    }
}
结果为什么不变?我知道java的参数都是按值传递,但是如果按值传递的是一个对象的引用的话,在方法中改变引用的值会引起参数值的同步变化,因为都是指向一个地址。比如参数是一个类的object的话,一定同步变化。但是int k= new Integer(10)中k已经是一个指向堆中内存的引用变量了,为什么不变化呢?

解决方案 »

  1.   

    知道自动拆包,自动装包不?
    int类型怎么能指向一个引用?
      

  2.   

    int   k=   new   Integer(10)中k
    在 java 进行自动解包时,已经不再是类了,所以不存在对象引用问题
      

  3.   

    那么说只在jdk1.5中才有这样的情况?因为拆包装包是1.5的新特性
      

  4.   

    你也只有在5.0以上才能运行。其他版本直接给你咔嚓掉了。
    同时,顺便说一句,Java是传引用。
      

  5.   

     int   k=   new   Integer(10)   ; 
    这是1.4以上版本才加上的参考.net的自动装箱拆箱。
    1.4及一下版本会报错的,编译都通不过。
      

  6.   

    改成Integer i = new Integer(x);试试
      

  7.   

    不关你怎么改都是不行的
    Because:public   static   void   changeInt(int   i){
                  i   =   i+1   ;
                  System.out.println(i);
            } 
    这个方法是 按值传递的, 如果想要改变 K的值 就必须改为
           public static int changeInt(int i){
                i=i+1;
                System.out.println(i);
                return i;
           }
         .....
         k=changeInt(k)或把K变为局部变量  方法改为
     public   static   void   changeInt(int   i){
                  k   =   i+1   ;
                  System.out.println(k);
            } 
      

  8.   

    基本类型int long char等等 再加一个String
    都是值传递,不会引用传递
    想测试引用传递,你可以做一个测试类
    class MyInt{
    public int k;
    }
    public void changeInt(MyInt mi){
     mi.k ++;public test(){
     MyInt mi = new MyInt();
     mi.k = 10; System.out.pringln(mi.k);
     changeInt(mi);
     System.out.println(mi.k);
    }