Java中的值传递与“引用传递”
2017-11-08 18:07
267 查看
首先解释下值传递和引用传递:
值传递:传递的是值的拷贝,就是在方法调用的时候,实参是将自己的一份拷贝传递给形参,也就是说传递后实参与形参就互不相关了。在方法内,对该参数值的修改不影响原来实参。
引用传递:指的是在方法调用时,参数是按引用进行传递,也就是实参的内存空间地址。此时在方法内对该参数值的修改会影响到实参。
然后抛个问题:
Java中对象作为参数传递给一个方法,到底是值传递还是引用传递?
答案:值传递。 Java中只有值传递,没有引用传递。
那疑问就来了:在Java中,经常会将一个对象作为参数传递给一个方法,而在方法内部对形参的修改是会影响到该对象的。这么来看,这种参数传递方式不就是引用传递吗?
其实不然,下面我们来一步步看下为什么这种传递方式并不是引用传递。
1.首先看下值传递的一个例子:
test方法中的a=5
main方法中的a=3
这个很好理解,test方法中的a是一份拷贝,想怎么改怎么改,不影响main方法中的a。
2.然后看下一个例子:
bad boy
这个结果让人觉得,这不就是引用传递吗?
3.现在我们把test方法中第一行的注释放开,运行一下,结果为:
bad
这还是引用传递吗?显然不是。在test方法中对形参s的引用地址进行了修改,如果是引用传递,此时对形参s的改变就是对实参sb的操作,那么输出应该为“good boy”。但实际上并不是这样,这说明实参sb指向的还是原来的对象,而形参s指向的才是新创建的对象,这也就说明了Java中的对象传递也是值传递。
下面用图的形式,更加直观的解释下参数到底是怎么传递的:
结合上图和例子,应该就能理解Java中的参数传递了。
最后总结一句:
Java的参数传递,不管是原始类型还是引用类型,传递的都是副本(实参的拷贝),一个是值的副本,一个是引用的副本。
值传递:传递的是值的拷贝,就是在方法调用的时候,实参是将自己的一份拷贝传递给形参,也就是说传递后实参与形参就互不相关了。在方法内,对该参数值的修改不影响原来实参。
引用传递:指的是在方法调用时,参数是按引用进行传递,也就是实参的内存空间地址。此时在方法内对该参数值的修改会影响到实参。
然后抛个问题:
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 值传递 和 引用传递
- 老生常谈--java中到底是按值传递还是按引用传递
- 【转】java到底是按值传递还是按引用传递?
- Java中只有按值传递,没有按引用传递!(两种参数情况下都是值传递)
- Java面向对象-方法的值传递和引用传递
- Java方法的值传递和引用传递
- JAVA学习笔记(七)- 值传递与引用传递
- Java是值传递还是引用传递?
- Java中的值传递与引用传递
- Java中被面试官套路过的值传递和引用传递
- java是值传递还是引用传递。
- java 值传递和引用传递。
- 关于java中的值传递与引用传递的见解
- 【Java】官网中方法的值传递和引用传递
- JAVA是值传递还是引用传递
- Java中,String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?
- 为什么java方法中只有值传递,没有引用传递
- Java的值传递与引用传递
- 【java】值传递和引用传递理解
- Java中函数参数的传递是值传递还是引用传递