值存在哪里,值是什么
例子1
void swap(int a, int b) {int temp = a;a = b;b = temp;printf("in swap: a = %d,b = %d \n", a, b);}int main() {int a = 10, b = 20;printf("before swap in main: a = %d,b = %d \n", a, b);swap(a, b);printf("after swap in main: a = %d,b = %d \n", a, b);return 0;}//output//before swap in main: a = 10,b = 20//in swap: a = 20,b = 10//after swap in main: a = 10,b = 20
内存地址100存的10,104存的20,而swap栈帧中的10和20是main栈帧的一份拷贝值,字面量是10和20(内存地址已经更新为swap栈帧中的内存地址了,他们值虽然一样,但是已经不是同一份数据了)
例子2
void swap(int *a, int *b) {int *temp = a;*a = *b;*b = *temp;}int main() {int a = 10, b = 20;printf("before swap in main: a = %d,b = %d \n", a, b);printf("address a: %p,address b:%p\n", &a, &b);swap(&a, &b);printf("after swap in main: a = %d,b = %d \n", a, b);return 0;}//output//before swap in main: a = 10,b = 20//address a: 0x7ffee049e8c8,address b:0x7ffee049e8c4//after swap in main: a = 20,b = 20

传递的是内存地址,直接改的对应内存地址里边的数据,自然是可以同步影响到main函数所在栈帧的。
回到Java,虽然都是传值,但是有的值就是字面值,例如 1 2 "chenshun",但是有的值存的只是堆对象的一个引用,虽然他们是两个对象,但是引用的对象地址却是同一个,通过引用修改堆上的数据,自然就可以影响到mian函数了。
