网上很多文章来讲JAVA的传递,一部分说是引用传递,一部分说是值传递。
直到读到《Java核心技术 卷I》 第四章对象和类有明确的例子来说明这个问题。
1.对象变量并没有实际包含一个对象
首先我们要认识到Java中 一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。
2.Java和C语言方法参数传递之间区别
《Java核心技术 卷Ⅰ》P119
首先我们看一下有引用调用的C语言
#include <stdio.h>
void swap(int *x ,int *y){
int temp = *x;
*x = *y;
*y = temp;
}
int main(int argc, char *argv[])
{
int a = 1;
int b = 2;
int *ai = &a;
int *bi = &b;
printf("%d %d\n",a,b);
printf("%d %d\n",ai,bi);
swap(ai,bi);
printf("swap(ai,bi);交换后\n");
printf("%d %d\n",a,b);
printf("%d %d\n",ai,bi);
return 0;
}
按照上述代码,我们可以看到输出,a和b的int值确实改变了。
而如果按照java的代码 并不会改变
总结,
C语言中,其实指向的ai bi 的地址也没有改变, 但是指向的内存里面的int值改变了。
java中并没有像C语言那样能把内存中的内容交换,而是建立了两个副本,副本指向的地址改变。方法结束后,两个副本被丢弃没有任何影响,而不是像C中,交换了内存中的值。