public class IntegerProblem {
public static void main(String[] args) {
Integer ii = 1;
swapInteger(ii);
System.out.println(ii);
  
 
}

public static void swapInteger(Integer i){
System.out.println("=="+i);
i = new Integer(56);
System.out.println("=="+i);
}

运行结果
==1
==56
1
Integer是包装类。他传递的是引用(的值)吧 可为什么 他的引用的对象没变。。
public class IntegerProblem {
public static void main(String[] args) {
int ii = 1;
swapInteger(ii);
System.out.println(ii);
  
 
}

public static void swapInteger(int i){
System.out.println("=="+i);
i = new Integer(56);
System.out.println("=="+i);
}

这样都好理解。可是Integer是个包装类 传递的就不是值了。而是引用的值了吧。为什么。谁能解答

解决方案 »

  1.   

    我想应该是这样的,integer是一个引用没错,你传递的也是一个引用,这个引用指向对象ii,而在swapInteger方法中,会生成一个新的引用会产生一份新的引用(不妨叫做y)。此时,ii 和y指向了同一个对象。所以此时,如果你对新生成的对象进行操作就会同时改变ii的状态,但是你的i = new Integer(56);这条语句,让 y 指向另外一个对象,此时ii和y就指向了不同的对象。y修改了它指向的对象的属性,很显然不会影响到ii指向的对象.不知道我这样说你能不能明白。
      

  2.   

    你还是没有理解彻底。
    java中从来所说的,都是只有单向值传递,而没有引用传递。这里可以这样认为,在另一个函数中,参数相当于一个局部变量,不可能通过更改局部变量试图更改参数传入对象的内存地址,亦即不是C里面传入的&ii。
      

  3.   

    变量作用域问题,swap方法里的是临时Integer引用,指向了新的对象,main方法里的对象引用指向的内容并没有改变    public static void changeInteger(Integer i) {
         System.out.println("=="+i);
         i += 30000;
            System.out.println("=="+i);
        }即使在main方法里调用这个方法,Integer变量引用的内容还是没有改变的,可能是由于Integer型的特殊性?谁来解释这个?
      

  4.   

    呵呵 基础问题哈 java中实参与形参的问题
      

  5.   


    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
    Object object = new Object();
    System.out.println(object.hashCode());
    test(object);
    System.out.println(object.hashCode());
    }

    private static void test(Object object){
    System.out.println(object.hashCode());
    object = new Object();
    System.out.println(object.hashCode());
    }
    你的代码,和我这代码的实质是一样的。自己试着去想通吧!画个内存图就明白了。
      

  6.   

    根据Java参数的值传递原则,函数内改变形参的值(赋值操作)不会引发实参值的改变。如下例:// 例1
    public class Test {
        public static void main(String[] args) {
            int ii = 1;
            swapInteger(ii);
            System.out.println(ii);  // 1
        }
        
        public static void swapInteger(int  i){
            System.out.println("=="+i);  // 1
            i = 56;
            System.out.println("=="+i);  // 56
        }
    }===========================
    当实参的类型不是基本类型而是引用类型时,值传递的原则也未发生改变。// 例2
    public class Test {
        public static void main(String[] args) {
            Integer ii = 1;
            swapInteger(ii);
            System.out.println(ii);  // 1
        }
        
        public static void swapInteger(Integer  i){
            System.out.println("=="+i);  // 1
            i = new Integer(56);
            System.out.println("=="+i);  // 56
        }
    }问题在于引用类型的值是什么?引用类型的值是所指对象的内存地址,而不是所指对象的内容。
    函数内的赋值操作仅仅改变了形参的值,并没有改变原始对象的内容。===========================
    至于int与Integer之间的区别,这只不过是Java给我们玩的障眼法而已。
    Java只不过为我们提供了简单的可以互换类型的操作,仅此而已。
    试想:    public static void swapInteger(int  i){
            System.out.println("=="+i);  // 1
            i = new Integer(56);
            System.out.println("=="+i);  // 56
        }或者:    public static void swapInteger(Integer  i){
            System.out.println("=="+i);  // 1
            i = 56;
            System.out.println("=="+i);  // 56
        }甚至:    public static void swapInteger(Integer  i){
            System.out.println("=="+i);  // 1
            i += 56;
            System.out.println("=="+i);  // 57
        }上述代码修改的仍然是形参的值,不会影响函数参数值传递的本质。
      

  7.   

    public static void swapInteger(Integer i)..调用这个方法 创建了一个i的对象  指向ii的地址。传递的是形参的值。
    i = new Integer(56); 创建了一个Integer对象,i此时的指向的地址也更改成了此对象的地址!