不少同学总是质疑java编程中参数的传递,到底是传值还是传引用?总是模棱两可,导致编程涉及到 这方面时很苦恼,关于这个问题,我在这里记述一下我的理解,欢迎批评指正。
首先锁定一个根本方向:java中只有传值!
这里就有同学纳闷了,只有传值还要传引用这一说法干吗?为了便于理解,我们又可以这样说:
在java中,简单数据类型是按值传递的,对象是按引用传递的。。。晕,这人怎么说话颠三倒四的, 唐僧了。。。。哈哈,莫急,听我慢慢道来。。。。
1. 所谓传值,压栈的是参数值的副本,是把实参的值赋值给形参,对形参的任何修改,都不会影响到 实参的值;
2. 而传引用(类似于C中的指针),压栈的是引用的副本,是以地址的方式传递参数,传递以后,形 参和实参都指向同一个对象,只是他们名字可能不同而已,对形参的修改将影响实参的值。
细心的看客应该意识到了,上边第2条中,引用的副本本身也是按值传递,所以,刚开始那种说法就通 了——java中只有传值!
看过介绍,再结合下述例子看看是不是就懂了?
Java代码
package com.test;
class Value {
int i = 10;
}
public class Test {
public static void main(String[] args) {
Test t = new Test();
Value v = new Value ();
int i = 10;
System.out.println("a v.i = " + v.i + ", i = " + i);
t.test(v, i);
System.out.println("c v.i = " + v.i + ", i = " + i);
}
private void test(Value v, int i) {
v.i = 20;
i = 20;
System.out.println("b v.i = " + v.i + ", i = " + i);
}
}
输出结果为:
a v.i = 10, i = 10
b v.i = 20, i = 20
c v.i = 20, i = 10