Java中值传递和地址传递
为了更好的理解Java中的值传递和地址传递,首先需明确Java中的数据类型有哪些:
Java中的数据类型:
- 基本数据类型:八大基本数据类型包括:字节(byte)、短整形(short)、整形(int)、长整形(long)、单精度浮点型(float)、双精度浮点型(double)、单字符型(char)、布尔值(boolean);
- 引用数据类型:类、接口、数组;
值传递和地址传递概念:
- 值传递:传入变量的数值,函数不能改变变量的数值;即在函数中形参发生变化不影响实参;
- 地址传递:传入变量的地址,函数可以根据变量地址,访问变量,自然就能改变变量的值;又名引用传递,传递引用对象,在函数变化中形参的变化会影响实参;
Java中的值传递和地址传递:
-
对于基本数据类型,在方法调用时,传递的参数按值的拷贝传递,传递的是值的拷贝,也就是说传递后就互不相关了。示例如下:
public class PassValue { public static void main(String[] args) { int a = 10; short b = 20; double c = 30.4; change(a); System.out.println("main中的a = " + a); change(b); System.out.println("main中的b = " + b); change(c); System.out.println("main中的c = " + c); } public static void change(int a){ a = 50; System.out.println("change中的 a = " + a); } public static void change(short b){ b = 50; System.out.println("change中的 b = " + b); } public static void change(double c){ c = 50.0; System.out.println("change中的 c = " + c); } }
结果展示:
change中的 a = 50 main中的a = 10 change中的 b = 50 main中的b = 20 change中的 c = 50.0 main中的c = 30.4
-
对于引用数据类型:在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。栈中的变量存储的即为内存空间的地址,即对于引用数据类型,Java在进行方法调用时,也是将变量中保存的地址作为拷贝值进行传递;示例如下:
public class PassValue { public static void main(String[] args) { String name = "ahtoh"; change(name); System.out.println("main中的 name = "+ name); } public static void change(String a){ a = "ahtohlove"; System.out.println("change中的 a = " + a); } }
结果展示:
change中的 a = ahtohlove main中的 name = ahtoh
分析如下:
- name = “ahtoh”;
- 调用change()方法时,拷贝“ahtoh”的地址,即拷贝了name中的值;
- a重新赋值并指向了"ahtohlove";
- name指向不变,还是指向"ahtoh";
-
示例代码:
public class PassValue { public static void main(String[] args) { StringBuilder name = new StringBuilder("ahtoh"); change(name); System.out.println("main中的 name = "+ name); } public static void change(StringBuilder a){ a.append("love"); System.out.println("change中的 a = " + a); } }
结果展示:
change中的 a = ahtohlove main中的 name = ahtohlove
分析如下:
- name = “ahtoh”;
- 调用change()方法时,拷贝“ahtoh”的地址,即拷贝了name中的值;
- change()方法直接改变了指向对象的值"ahtoh"+“love”;
- 引用没有改变,引用指向的值发生了改变,因此结果变成了ahtohlove;
总结:Java只有值传递!