Java中参数传递的机制
参数传递分为两种情况
其中 ex.str ,ex.ch为实参;String str,char ch[] 为形参。
引用类型的参数传递
对于引用类型的参数传递,当您重新分配一个新的对象给形参时,形参将引用新的对象,而不影响原始的实参。即形参引用地址改变,实参不变。这是因为形参和实参是不同的变量,它们存储的是对象的引用地址。
对于不可变的引用类型,例如String,一旦创建了一个字符串对象,它的内容就不能被修改。当您对String对象进行连接、替换等操作时,实际上是创建了一个新的字符串对象,而不是修改原始对象。使得形参更换了引用地址,而实参没有变。如str = "test ok";
因此,形参的引用地址会更换到新创建的对象,而原始的实参保持不变。
对于可变的引用类型,例如数组,如果您重新分配一个新的数组对象给形参,形参将引用新的数组对象,而实参保持不变。如ch = new char[]{'6', '5', '4'}
但是,如果您对数组的元素进行修改,因为形参和实参引用的是同一个数组对象,对元素的修改会影响原始的实参但不会改变地址。所以ch[0] = 'g';
会使得原始的实参发生改变。
基本数据类型的参数传递
对于基本数据类型的参数传递,Java中采用的是按值传递。当将基本数据类型作为参数传递给方法时,实际上是将该值的副本传递给了方法。在方法内部对参数的修改只会修改参数的副本,
而不会影响原始的变量(实参)。方法内部对参数的修改不会影响原始的变量的值。
所以最终的结果为
Bonnie and gbc
结论
- 基本数据类型作为方法参数, 传递的是值
- 引用类型作为方法参数, 传递的是地址
内存图
每一个方法栈,空间都独立,没有关系。
str,ch是change方法里的变量,和成员变量str,ch没有关系。
当方法结束,栈空间释放,str,ch就没了。