最近在写排序的时候写了一个swap()方法,代码如下
public void swap(Integer a,Integer b){ Integer temp = a; a = b; b = temp; }
我传进去的是引用,为什么调用方法后,a和b还是没有交换值?也就是说a和b的指向应该变了啊?虽然Integer底层的value是final的。(ps:这里说的a和b是调用swap()方法的那个方法里的a和b,即实参a和b。 不要弄混!!)
对于对象,传递的是参数的引用,虽然结束以后a,b确实交换了,但是因为他们是参数局部变量,方法结束以后丢弃,仍然是a指向a,b指向b
对,最近看了下《core java》
上面有说到这个问题
我改变的只是形参的指向,对形参的指向并没有影响
如图
package test;
public class Test0907 {
public static void main(String[] args)
{
// TODO Auto-generated method stub
Integer a=1,b=10;
System.out.println("交换前 :"+a+" "+b);
Test0907.swap(a, b);
System.out.println("交换后 "+a+" "+b);
Test0907.swap(1, 10);
}
private static void swap(Integer a,Integer b)
{
Integer tem=a;
a=b;
b=tem;
System.out.println("方法内 :"+a+" "+b);
}
}
基本类型及其包装类 都属于传值
可这是引用类型啊
@rm_rf: 传值的一种九种,, 八大基本类型及其包装类外加string
@窦光大大存大大凯: 这个不是传值的问题,你看我的问题补充那里,说得很清楚
不行,java基础类型都是按值传递,你改的生效范围仅在你方法内部有效。
有两种办法
1:换.net,一个swap(ref int a,ref int b)即可 :)
2:对对象做包装,class wapper<T>{ public T getValue()....}
这不是基础类型这是引用
如果想理解更深入,请看下jvm内存模型相关。。。。
a-->temp = temp
b-->a = temp
b--> temp = temp
作用域不同啊!你这里只改变了swap()方法参数的a和b引用,而调用swap()方法的那个方法里的a和b并没有改变,也就是说俩个a,b是不同的
对的
你和三楼说的是一个意思