您的位置:首页 > 编程语言 > Java开发

Java中的值传递与“引用传递”

2017-11-08 18:07 267 查看
首先解释下值传递和引用传递:

值传递:传递的是值的拷贝,就是在方法调用的时候,实参是将自己的一份拷贝传递给形参,也就是说传递后实参与形参就互不相关了。在方法内,对该参数值的修改不影响原来实参。

引用传递:指的是在方法调用时,参数是按引用进行传递,也就是实参的内存空间地址。此时在方法内对该参数值的修改会影响到实参。

然后抛个问题:

Java中对象作为参数传递给一个方法,到底是值传递还是引用传递?

答案:值传递。 Java中只有值传递,没有引用传递。

那疑问就来了:在Java中,经常会将一个对象作为参数传递给一个方法,而在方法内部对形参的修改是会影响到该对象的。这么来看,这种参数传递方式不就是引用传递吗?

其实不然,下面我们来一步步看下为什么这种传递方式并不是引用传递。

1.首先看下值传递的一个例子:

public class TempTest {
private void test (int a) {
a = 5;
System.out.println("test方法中的a=" + a);
}
public static void main (String[] args) {
TempTest tt = new TempTest();
int a = 3;
tt.test(a);
System.out.println("main方法中的a=" + a);
}
}
输出结果为:

test方法中的a=5

main方法中的a=3

这个很好理解,test方法中的a是一份拷贝,想怎么改怎么改,不影响main方法中的a。

2.然后看下一个例子:

public class TempTest {
private void test (StringBuffer s) {
//s = new StringBuffer("good");
s.append("boy");
}
public static void main (String[] args) {
TempTest tt = new TempTest();
StringBuffer sb = new StringBuffer("bad ");
tt.test(sb);
System.out.println(sb);
}
}
输出结果为:

bad boy

这个结果让人觉得,这不就是引用传递吗?

3.现在我们把test方法中第一行的注释放开,运行一下,结果为:

bad

这还是引用传递吗?显然不是。在test方法中对形参s的引用地址进行了修改,如果是引用传递,此时对形参s的改变就是对实参sb的操作,那么输出应该为“good boy”。但实际上并不是这样,这说明实参sb指向的还是原来的对象,而形参s指向的才是新创建的对象,这也就说明了Java中的对象传递也是值传递。

下面用图的形式,更加直观的解释下参数到底是怎么传递的:



结合上图和例子,应该就能理解Java中的参数传递了。

最后总结一句:

Java的参数传递,不管是原始类型还是引用类型,传递的都是副本(实参的拷贝),一个是值的副本,一个是引用的副本。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 值传递