有关java调用方法参数传递的分析
这个问题好多文章都讲过了,在此本人补充一下,加深理解,有不足之处请指教。
相信做java开发同学们都知道,调用方法传递参数时,不论是基本类还是引用类型,
java都是值传递,不存在引用传递(称引用传递,只是便于理解,不过看到我下面的例子,就要注意了)。
先看这里例子:预期输出结果是什么?
public class Test4 class Domain |
<br>
实际输出结果:
调用chenge方法之前:name=test01
调用chenge方法之后:name=test02
调用chenge2方法之前:name=www01
调用chenge2方法之后:name=www01
-------------------------------------------------------------------------------------
分析:
代码中方法chenge和chenge2都是应用类型作为入参的;
对于调用方法chenge的结果很好理解;对于调用方法chenge2就要好好分析了。
因为:java中调用方法时的入参都是值传递(不管是基本类型还是引用类型)
所谓的值传递,按照jdk的介绍,本质是变量名的拷贝被传到方法中,比如 基本类型变量、引用类型变量,在传递到方法中时,
都是该变量的一个拷贝。基本类型的值都保存在栈用中(实际栈的值是共享的),调用方法后不会影响原来的值。
(1)针对例子中的chenge方法:chenge(domain); 这里的变量domain会有一个拷贝传到chenge方法体内,这个拷贝变量同样与domain指向之前的对象。
方法chenge中的 domain.setName("test02") 语句,实际修改的是拷贝变量指向的对象,由于变量domain与拷贝变量同时指向一个对象,
变相的修改了domain的指向对象。
因此打印结果为:
调用chenge方法之前:name=test01
调用chenge方法之后:name=test02
(2)由(1)的分析,就好理解chenge2方法了。
chenge2方法是将拷贝变量指向了另一个新的对象,不影响原来的对象,
因此打印结果为:
调用chenge2方法之前:name=www01
调用chenge2方法之后:name=www01