黑马程序员技术交流社区

标题: Java中的方法的参数传递方式都是值传递? [打印本页]

作者: 张贺    时间: 2014-2-27 22:35
标题: Java中的方法的参数传递方式都是值传递?
以前学习过.net,在讲到方法的参数时,提到其参数传递有两种,一种是值传递,传递的是对数据的拷贝,另一种是引用传递,传递的是其引用,也就是真实数据的地址,而在看到Java相应章节时,教程中说,参数传递方式都是值传递,有些困惑。
作者: 乔青山    时间: 2014-2-27 23:05
本帖最后由 乔青山 于 2014-2-27 23:07 编辑

是的
这个问题我也就纠结了好久,不过看过一个帖子,写的很通俗易懂,然后就明白了。大概意思是这样的:
说到引用传递呢,看一下下面这个代码:

class Demo{
     int a;
     public Demo(int a){
         this.a=a;
     }
}
public class TestQuote{
     public static void main(String args[]){
         Demo d1=new Demo(1);
         Demo d2=new Demo(2);
         System.out.println(d1.a);
         System.out.println(d2.a);
         function(d1,d2);
         System.out.println(d1.a);
         System.out.println(d2.a);
     }
     private static void function(Demo d1,Demo d2){
         int a;
         a=d1.a;
         d1.a=d2.a;
         d2.a=a;
     }
}
运行结果是:
1
2
2
1

可以看出a,b的值发生了交换,所以有的人说这是引用传递。对于这种说法呢,我们可以再看一下下面这段代码:
class Demo{     int a;
     public Demo(int a){
         this.a=a;
     }
}
public class TestQuote{
     public static void main(String args[]){
         Demo d1=new Demo(1);
         Demo d2=new Demo(2);
         System.out.println(d1.a);
         System.out.println(d2.a);
         function(d1,d2);
         System.out.println(d1.a);
         System.out.println(d2.a);
     }
     private static void function(Demo d1,Demo d2){
         Demo temp;
         temp=d1;
         d1=d2;
         d2=temp;
     }
}
这次运行的结果呢:
1
2
1
2

那这次为什么没有改变?因为d1和d2是值传递,function函数中的d1和d2是main中d1和d2的副本
所以,function中的改变完全不会对main中的d1和d2产生影响。


但是,上面的程序为什么a和b发生了交换呢,因为function函数中是对d1和d2所指向内存中的值(!)进行了改变


实际上d1和d2并没有改变,仍然指向调用前堆中的对象,
function函数的参数是栈中的d1和d2,而不是堆中所指向的d1对象和d2对象
虽然,在函数中改变了堆中对象的值,但是并没有改变对象的引用。





作者: 山治0712    时间: 2014-2-27 23:39
Java参数传递方式是引用传递的吧
作者: 张贺    时间: 2014-2-27 23:49
你的意思我明白,你觉得.net中参数传递的机制跟Java中的有什么不同吗?我个人感觉是一样的,那为什么在.net中把传递地址的方式叫做引用传递,而在Java中却不是呢?
作者: 张贺    时间: 2014-2-27 23:50
F:\reference.jpg
作者: 张贺    时间: 2014-2-27 23:52
这是我刚在百度上找的
作者: 不再散步    时间: 2014-2-27 23:58
java中的确是都是传值的。
对于传入类型是基本数据类型,传值当然好理解。
对于传入类型是对象来说,传值指的是传入的是栈内存的对象的引用,也就是说传入的也是值,只不过这个值指向了堆内存中的某个对象。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2