目录
- 理解Java引用数据类型(数组、String)传参机制的一个例子
- 理解
- 样例代码
- 输出
- 参考资料
理解Java引用数据类型(数组、String)传参机制的一个例子
理解
- 引用数据类型传递的是地址。
- 用引用类型A给引用类型B赋值,相当于使B指向的地址为A指向的地址。此时修改B地址指向的元素等于修改A地址指向的元素,A原先指向的地址中的内容不变。
- 引用类型形参传参,传递的是地址。
样例代码
代码中打印了数组的地址,仔细观察地址的变化,看懂后基本就明白是怎么回事了。
重点观察下面代码中的两个等号(有注释的两个位置)。
- 在递归函数中
str = str0;
之后再把str
传给下一个函数(替换了形参的地址)。 - 在下一次递归时,又
str = str0;
,所以1.中的str
最开始所指向的地址中的内容并未发生改变。必须使用“=”号把形参的地址传回来,赋给str
。注意,此时仍然不是修改所指向的地址中的内容,而是直接修改str
的地址!!!
public class Hello{
public static void main(String[] args){
ChangeAttr myChangeAttr = new ChangeAttr();
myChangeAttr.sttt();
}
}
class ChangeAttr{
public void sttt(){
int str[] = {0};
System.out.println(str);
str = strr(str, 2); //接收递归最深处的地址,并赋给str
// 如果没有这一步的 “=” 的话,str就没有变化,因为递归函数没有对str地址的内容进行修改!!!!
// 递归函数中直接将形参的地址换成了str0的地址,并非修改str地址所指向的元素的内容
System.out.println(str);
System.out.println(str[0]);
}
public int[] strr(int[] str, int x){
int str0[] = {str[0] - 1};
if (x!=0){
System.out.println(str);
System.out.println(str0);
str = str0;
System.out.println(str[0]);
System.out.println(str);
System.out.println(str0);
str = strr(str, x-1); //把递归最深处的地址传递给str(最后一次递归、下探)
// 最终将结果传回sttt()中调用strr的地方
// 如果没有这一步的 “=” 的话,最后传回sttt()中调用strr的地方的地址是 第一层递归的地址!!!
// 因为一直没有对str的内容进行更新!!!
// 每一次调用strr(str, x-1);都是一次递归(一次成功下探),
}
System.out.println("re" + str[0] + "" + x + "@" + str0[0]);
System.out.println(str);
System.out.println(str0);
return str;
}
// public void sttt(){
// String str[] = {"qwe"};
// str = strr(str, 5);
// System.out.println(str[0]);
// }
// public String[] strr(String[] str, int x){
// if (x!=0){
// String str0[] = {str[0] + "" + x};
// str = str0;
// System.out.println(str[0]);
// strr(str, x-1);
// }
// System.out.println("re" + str[0] + "" + x);
// return str;
// }
}
输出
D:\Java\demo>java Hello
[I@78e03bb5
[I@78e03bb5
[I@5e8c92f4
-1
[I@5e8c92f4
[I@5e8c92f4
[I@5e8c92f4
[I@61e4705b
-2
[I@61e4705b
[I@61e4705b
re-20@-3
[I@61e4705b
[I@50134894
re-21@-2
[I@61e4705b
[I@61e4705b
re-22@-1
[I@61e4705b
[I@5e8c92f4
[I@61e4705b
-2
参考资料
[1]
[2]
[3]