1.基本数据类型参数传递
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a1 = "+ a+ ", b1 = "+b);
change(a, b);
System.out.println("a4 = "+ a+ ", b4 = "+b);
}
public static void change(int a, int b) {
System.out.println("a2 = "+ a+ ", b2 = "+b);
int temp = a;
a = b;
b = temp;
System.out.println("a3 = "+ a+ ", b3 = "+b);
}
结果:
结论:基本数据类型的值传递,不改变原值。因为调用后就会弹栈,局部变量随之消失。String类虽然是引用数据类型,但是它当做参数传递时是和基本数据类型一样的
2.引用数据类型参数传递
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
System.out.print("数组值传递之前:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
change(arr);
System.out.print("数组值传递之后:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void change(int arr[]) {
for (int i = 0; i < arr.length; i++) {
if (arr[i]%2 == 0) {
arr[i]*=2;
}
}
}
结果
结论:引用数据类型的值传递,改变原值。因为即使方法弹栈,堆内存的数组对象还在,可以通过地址继续访问。
面试题:Java中参数传递到底是传值还是传地址?
- 一种认为是:基本数据类型传递的是值,即使传值,也是传地址,引用数据类型传递的是地址
- 另一种认为(目前认为是正确的,面试答这个):Java中只有值传递,因为地址值也是值。支持者是Java之父詹姆斯·高斯林