首页 新闻 会员 周边

Java传引用问题

0
悬赏园豆:20 [已解决问题] 解决于 2017-09-15 12:53

                        最近在写排序的时候写了一个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。 不要弄混!!)

问题补充:
 我试了下
大概清楚了
虽然可以向方法中传引用
但是只能改变对象的属性
并不能改变实参的指向
 
 
 
 


modify()方法的实现:


运行结果:
 
 
 但是可以修改属性
如下图
 
 
 
        形参和实参都指向堆中的同一个对象。如果我让形参指向另一个对象,那是形参的事,不关实参什么事(因为形参在使用完后会被销毁,而且形参和实参是不同的引用变量,改变形参的指向并不会影响实参。)。但是如果我改变了形参的属性,实参的属性也会随之改变。因为它们指向同一个对象。
        
 
rm_rf的主页 rm_rf | 初学一级 | 园豆:6
提问于:2017-09-07 18:57
< >
分享
最佳答案
0

对于对象,传递的是参数的引用,虽然结束以后a,b确实交换了,但是因为他们是参数局部变量,方法结束以后丢弃,仍然是a指向a,b指向b

收获园豆:20
何甜甜在吗 | 菜鸟二级 |园豆:357 | 2017-09-08 15:20

对,最近看了下《core java》

上面有说到这个问题

我改变的只是形参的指向,对形参的指向并没有影响

rm_rf | 园豆:6 (初学一级) | 2017-09-12 12:56

 

  如图

rm_rf | 园豆:6 (初学一级) | 2017-09-12 16:13
其他回答(5)
0

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);
}

}

基本类型及其包装类 都属于传值

窦光大大存大大凯 | 园豆:220 (菜鸟二级) | 2017-09-07 19:25

可这是引用类型啊

支持(0) 反对(0) rm_rf | 园豆:6 (初学一级) | 2017-09-12 16:10

@rm_rf: 传值的一种九种,, 八大基本类型及其包装类外加string

支持(0) 反对(0) 窦光大大存大大凯 | 园豆:220 (菜鸟二级) | 2017-09-13 16:50

@窦光大大存大大凯: 这个不是传值的问题,你看我的问题补充那里,说得很清楚

支持(0) 反对(0) rm_rf | 园豆:6 (初学一级) | 2017-09-13 20:47
0

不行,java基础类型都是按值传递,你改的生效范围仅在你方法内部有效。

有两种办法

1:换.net,一个swap(ref int a,ref int b)即可 :)

2:对对象做包装,class wapper<T>{ public T getValue()....}

Daniel Cai | 园豆:10424 (专家六级) | 2017-09-07 19:28

这不是基础类型这是引用

支持(0) 反对(0) rm_rf | 园豆:6 (初学一级) | 2017-09-12 12:54
0

如果想理解更深入,请看下jvm内存模型相关。。。。

曾有满腹理想的阿飞 | 园豆:224 (菜鸟二级) | 2017-09-08 16:06
0

a-->temp = temp

b-->a = temp

b--> temp = temp

YinJey | 园豆:265 (菜鸟二级) | 2017-09-11 22:13
0

作用域不同啊!你这里只改变了swap()方法参数的a和b引用,而调用swap()方法的那个方法里的a和b并没有改变,也就是说俩个a,b是不同的

追梦_坚持 | 园豆:207 (菜鸟二级) | 2017-09-12 12:22

对的

你和三楼说的是一个意思

支持(0) 反对(0) rm_rf | 园豆:6 (初学一级) | 2017-09-12 12:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册