估计我们 都多多少少学习过C语音的知识,我们应该都听过指针,简单的理解就是:存储变量在内存中的地址。

其实Java中的引用类似C语言中的指针的概念。


首先,你要明白什么是变量。变量的实质是一小块内存单元。这一小块内存里存储着变量的值

比如int a = 1;

a就是变量的名子,1就是变量的值。

而当变量指向一个对象时,这个变量就被称为引用变量

比如A a =new A();

a就是引用变量,它指向了一个A对象,也可以说它引用了一个A对象。我们通过操纵这个a来操作A对象。 此时,变量a的值为它所引用对象的地址
总而言之:当一个变量指向的是一个对象的时候,这个变量叫引用变量,也就是引用的概念,这个时候,这个变量存储的是这个对象在内存中的地址。
Java对对象和基本的数据类型的处理是不一样的,和C语言一样。
当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。这种方式的参数传递被称为"值传递"。
而在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。

产生:引用总是在把对象作参数"传递"的过程中自动发生,不需要人为的产生,也不能人为的控制引用的产生。这个传递包括把对象作为函数的入口参数的情况,也包括用"="进行对象赋值的时候。

范围:只有局部的引用,没有局部的对象。引用在Java语言的体现就是变量,而变量在Java语言中是有范围的,可以是局部的,也可以是全局的。

生存期:程序只能控制引用的生存周期。对象的生存期是由Java控制。用"new Object()"语句生成一个新的对象,是在计算机的内存中声明一块区域存储对象,只有Java的垃圾收集器才能决定在适当的时候回收对象占用的内存。没有办法阻止对引用的改动。