Java的参数传递到底是引用传递还是值传递
2016-08-30 17:14
295 查看
首先看一段代码:
输出:
改变前a:Person [age=23, name=a] b:Person [age=22, name=b]
改变后a:Person [age=10, name=a] b:Person [age=11, name=b]
然后我们要明确一下值传递和引用传递的概念:
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
参考博客园
我们都知道,Java的方法传递的是对象引用,形参和实参指向同一个对象的内存地址,所以形参修改对象的状态时,实参指向的对象状态也会发生变化。
上面的实例很容易让人认为Java是引用传递,因为形参对象的状态改变直接反应在实参对象上了!
再看一段代码:
输出:
交换前a:Person [age=23, name=a] b:Person [age=22, name=b]
交换后a:Person [age=23, name=a] b:Person [age=22, name=b]
很奇怪吧! 为什么a和b的值没有交换呢? 按照Java是引用传递的假设,a和b的指向的对象会发生交换啊!
很多程序设计语言(特别是C++和Pascal)提供了两种参数传递的方式:值传递和引用传递。有些程序猿(甚至本书的作者)认为Java对对象采用的是引用传递,实际上,这种理解是不对的。–《Core Java Volume I》第9版P122
实际上,结合上面一个实例和值传递引用传递的概念,我们可以发现,Java方法的传值,实际上是把实参的值—-对象引用(对象的内存地址)传递给了形参,从而形参和实参的值(即变量里存储的内存地址,非变量本身的内存地址)是相同的,指向了同一个对象/内存地址。
所以我们得到如下结论:Java的参数传值方式是值传递,而非引用传递。
public static void main(String[] args) { Person a = new Person(23, "a"); Person b = new Person(22,"b"); System.out.println("改变前a:"+a+"\nb:"+b); changeValue(a,b); System.out.println("改变后a:"+a+"\nb:"+b); } private static void changeValue(Person a, Person b) { a.setAge(10); b.setAge(11); }
输出:
改变前a:Person [age=23, name=a] b:Person [age=22, name=b]
改变后a:Person [age=10, name=a] b:Person [age=11, name=b]
然后我们要明确一下值传递和引用传递的概念:
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
参考博客园
我们都知道,Java的方法传递的是对象引用,形参和实参指向同一个对象的内存地址,所以形参修改对象的状态时,实参指向的对象状态也会发生变化。
上面的实例很容易让人认为Java是引用传递,因为形参对象的状态改变直接反应在实参对象上了!
再看一段代码:
public static void main(String[] args) { Person a = new Person(23, "a"); Person b = new Person(22,"b"); System.out.println("交换前a:"+a+"\nb:"+b); swap(a, b); System.out.println("交换后a:"+a+"\nb:"+b); } private static void swap(Person a, Person b) { Person temp = a; a = b; b = temp; }
输出:
交换前a:Person [age=23, name=a] b:Person [age=22, name=b]
交换后a:Person [age=23, name=a] b:Person [age=22, name=b]
很奇怪吧! 为什么a和b的值没有交换呢? 按照Java是引用传递的假设,a和b的指向的对象会发生交换啊!
很多程序设计语言(特别是C++和Pascal)提供了两种参数传递的方式:值传递和引用传递。有些程序猿(甚至本书的作者)认为Java对对象采用的是引用传递,实际上,这种理解是不对的。–《Core Java Volume I》第9版P122
实际上,结合上面一个实例和值传递引用传递的概念,我们可以发现,Java方法的传值,实际上是把实参的值—-对象引用(对象的内存地址)传递给了形参,从而形参和实参的值(即变量里存储的内存地址,非变量本身的内存地址)是相同的,指向了同一个对象/内存地址。
所以我们得到如下结论:Java的参数传值方式是值传递,而非引用传递。
相关文章推荐
- Java参数传递到底是值传递还是引用传递?
- Java中的参数传递方式到底是引用传递还是值传递?
- java参数传递时到底是值传递还是引用传递
- Java - 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- Java参数传递:到底是传值还是传引用
- java参数传递时到底是值传递还是引用传递
- Java中的参数传递方式到底是引用传递还是值传递?
- Java中的参数传递到底是引用还是值传递?
- 画重点,Java方法的参数到底是值传递还是引用传递?
- java面试题解惑:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- java参数传递究竟是按值呢,还是引用?
- JAVA传参数到底是值传递还是引用
- JavaScript 函数参数传递到底是值传递还是引用传递
- java 参数传递是引用传递还是值传递?
- java中的参数传递为引用传递还是传值传递
- java到底是按值传递还是按引用传递?
- 【转】java到底是按值传递还是按引用传递?
- Java中函数参数的传递是值传递还是引用传递
- java的方法调用,参数是按值传递还是按引用传递