黑马程序员技术交流社区
标题:
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
reference.jpg
(125.48 KB, 下载次数: 3)
下载附件
这是我刚在百度上找的
2014-2-27 23:51 上传
这是我刚在百度上找的
作者:
不再散步
时间:
2014-2-27 23:58
java中的确是都是传值的。
对于传入类型是基本数据类型,传值当然好理解。
对于传入类型是对象来说,传值指的是传入的是栈内存的对象的引用,也就是说传入的也是值,只不过这个值指向了堆内存中的某个对象。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2