引用这个东西对于很多程序语言都有,C++也有,不仅仅是java。
我一直认为java中的引用,就是一个别名,例如
int a = 3;
int b = 3;
int c = 3;
实际上,abc三个值都指向了内存的同一个块地方,且这个地址上的值为3,这样就可以理解为b,c都是a的别名,因为指向同一个地址。
这仅仅是最浅的理解,我们拿程序中说一下
public class text
{
public static void foo(int a,String b)
{
a = 3;
b = "asdasd";
}
public static void main()
{
int a = 0;
String b = "dsfs";
foo(a,b);
System.out.print(a+b);
}
}
输出结果是0dsfs
看似是值传递,但是如果把String换成数组呢?
public class text
{
public static void foo(int a,int[] b)
{
a = 3;
b[0] = 3;
}
public static void main()
{
int a = 0;
int[] b = new int[1];
b[0] = 1;
foo(a,b);
System.out.print(a);
System.out.print(b);
}
}
这样输出的结果是03,用了数组,值就会发生相应的改变,和C语言中的是一样,但是在C语言中,实际传递的是指针,所以会直接对某一块内存进行直接操作,但是java中不存在指针这一说法。
而当我传递的是2个对象,调用同样的功能函数,也会改变对象的值,所以我的个人理解是数组,类等对于java来说可能是一种相对复杂类型的变量,而不是像int,String这种类型。
我概括为两句话:java的参数传递中,如果传递的参数简单——采用值传递;如果传递参数复杂——传递地址。这就是我所理解的java中的引用,但是所谓值传递,地址传递,个人理解就是实际上有没有对原来的对象进行拷贝。
因为对象简单,所以就拷贝了(值传递),但是对象复杂,拷贝可能需要更大的内存空间,所以不拷贝(传递地址)。综上所述, 个人认为是语言或者是编译器对于整个内存环境的一个优化。