public class Test
{
public static <T> void swap(T a,T b)
{
T temp = a;
a = b;
b = temp;
} public static void main(String[] args) throws Exception 
{
Integer a = new Integer("333");
Integer b = new Integer("555");
swap(a,b);//怎么没有交换,a,b都是对象啊,是引用类型
println(a+","+b);
}}

解决方案 »

  1.   

    这个问题挺初级的。
    那个参数改变的只是swap方法内部的,也就是值传递。
    也就是说你把方法改成
    public static <T> void swap(T k,T k2)
        {
            T temp = k;
            k = k2;
            k2 = temp;
        }
    和你现在的是一样的。
    改变的只是该方法内的a,b的值,在方法内你输出一下,肯定是变了,但是主方法里面的值是不会变的。
      

  2.   


    public static void f(int[] array)
    {
    array[0] = 888;
    }这个函数为什么又能把主方法的数组该变呢?
      

  3.   

    ==================================================
    public final class Integer extends Number implements Comparable<Integer> {
    问题出在final上。
      

  4.   

    Java 中只有值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本,指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。
    希望对你有帮助!
      

  5.   

    只要是一个对象传入一个函数,就是传入这个对象的指针的值。不管你在函数里怎么改变这个指针的指向,外面的指针不受影响。
    你的函数:
    Integer a = new Integer("333");
            Integer b = new Integer("555");
            swap(a,b);//怎么没有交换,a,b都是对象啊,是引用类型
            println(a+","+b);对等于:
    Integer a = new Integer("333");
            Integer b = new Integer("555");        // 以下代码跟swap(a,b)效果一样
            tempA = a;
            tempB = b;
            Integer temp = tempA;
            tempA = tempB;
            tempB = temp;        println(a+","+b);如果你真的要做一个类似的swap,可以这样:
    public class ValueContainer<T> {
      private T value;  public ValueContainer(T v) {
        value = v;
      }  public void setValue(T v) {
        value = v;
      }  public T getValue() {
        return value;
      }  @Override
      public String toString() {
        if (value == null)
          return "null";
        return value.toString();
      }
    }public class Test {
      public static <T> void swap(ValueContainer<T> a, ValueContainer<T> b) {
        T temp = a.getValue();
        a.setValue(b.getValue());
        b.setValue(temp);
      }  public static void main(String[] args) {
        ValueContainer<Integer> a = new ValueContainer<Integer>(333);
        ValueContainer<Integer> b = new ValueContainer<Integer>(555);
        swap(a, b);
        System.out.println(a + "," + b);
      }
    }
      

  6.   

    肯定不对啦,如果用int,就没问题
    java参数传递都是值传递,只是基本数据类型传值,非基本类型传地址,基本类型可以直接修改其值,而非基本类型相当于是拷贝,只是和源对象指向了同一地址,他如果直接修改自己,比如:

    public static void main(String[] args) throws IOException {
      char[]test = {'a','b','c'};
      exchange(test);
      System.out.println(test);
    }
    private static void exchange(char[] test){
    test = null;
    }
    如果它直接修改自己本身,对源对象不会有丝毫影响,但是他内部的属性修改是可以直接影响到的,比如A和B都指向地址C,A修改自己本身其实修改了自己指向的地址,可是他们共同指向C的属性是可以相互影响的,这就牵扯到深拷贝和浅拷贝了。 
      

  7.   

    java和c语言里面的指针相似,都是传值,基本类型直接传递值本身,非基本类型传递对象的地址值,String是非基本类型,为final类,不可以修改,你通过a = "123"相当于直接修改其地址,并非它所具有的的属性,对源对象不产生影响;而其他的非基本类型比如StringBuffer,其通过append等方法修改内部属性value,当然会影响源对象,其都是浅拷贝,只是拷贝了对象本身的地址,并未对对象的属性进行深层次拷贝。
      

  8.   

    因为传入的是数组,数组是一个对象,这里传入的是地址值。
    你也可以这样,比如传入一个对象,对象里面只包含一个变量int i,你传入这个对象,改变这个对象里面的变量值,这样的话外面的值就会有相应的改动了。
    其实最主要的还是传入机制吧,一般如果传入的是基本数据类型,都默认传入的是值,数组,对象,集合这类的,默认都传入地址值。
      

  9.   

    java只有值传递,不管是什么类型。你的方法里面直接对其进行赋值,肯定对原始对象没任何变动。对于数组,你没有对它进行直接赋值,仅仅是对它内部的东西进行了修改,那么即使原始对象没改变,但是内容也会随之改变。这个东西说着可能很复杂(实质上感觉确实也和引用传递很像),自己揣摩下很简单的。
    看看这个表述:
    http://developer.51cto.com/art/201103/251163.htm
      

  10.   

    可以看成是作用域的问题。
    在方法中,更改任意引用类型的值,都不会影响外部引用的值。
    因为,方法内的引用的作用域只是在方法内部,无法影响外部环境。
    想到一个方法Arrays.sort(),该方法可以将数组进行排序。
    但查看API文档,可以发现其参数都是基本类型数组,并不是引用类型数组。