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);
}}
那个参数改变的只是swap方法内部的,也就是值传递。
也就是说你把方法改成
public static <T> void swap(T k,T k2)
{
T temp = k;
k = k2;
k2 = temp;
}
和你现在的是一样的。
改变的只是该方法内的a,b的值,在方法内你输出一下,肯定是变了,但是主方法里面的值是不会变的。
public static void f(int[] array)
{
array[0] = 888;
}这个函数为什么又能把主方法的数组该变呢?
public final class Integer extends Number implements Comparable<Integer> {
问题出在final上。
希望对你有帮助!
你的函数:
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);
}
}
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的属性是可以相互影响的,这就牵扯到深拷贝和浅拷贝了。
你也可以这样,比如传入一个对象,对象里面只包含一个变量int i,你传入这个对象,改变这个对象里面的变量值,这样的话外面的值就会有相应的改动了。
其实最主要的还是传入机制吧,一般如果传入的是基本数据类型,都默认传入的是值,数组,对象,集合这类的,默认都传入地址值。
看看这个表述:
http://developer.51cto.com/art/201103/251163.htm
在方法中,更改任意引用类型的值,都不会影响外部引用的值。
因为,方法内的引用的作用域只是在方法内部,无法影响外部环境。
想到一个方法Arrays.sort(),该方法可以将数组进行排序。
但查看API文档,可以发现其参数都是基本类型数组,并不是引用类型数组。