类在通过new运算符实例化对象的过程中,Java虚拟机会为对象在堆(系统存储区域,用于存储应用程序创建的对象)中分配内存,并返回存储对象的内存地址,对象的内存地址就被称为对象的引用。
例如:
public static void main(String[] args) {
// 创建Rectangle对象
Rectangle rect = new Rectangle();
// rect对象的成员变量赋值
rect.width = 30;
rect.height = 20;
// 计算矩形的面积
int nArea = rect.getArea();
System.out.print("矩形的面积为:" + nArea);
}上面的代码使用new运算符创建了rect对象,此时rect存储的不是Rectangle类的实例化对象,而是对象在内存中的地址。
Rectangle rect = new Rectangle();
上面的语句可以分成两条语句来看:
Rectangle rect; rect = new Rectangle();
第1条语句声明了一个Rectangle类型的变量rect,它存放在栈空间(用来存储局部变量的存储空间),此时rect不指向任何内存地址,它的值是null。
第2条语句由new运算符创建了一个Rectangle对象,并将创建的Rectangle对象放在堆中,然后将Rectangle对象在堆中的地址赋值给rect变量,此时rect变量存储的就是Rectangle对象在堆中的地址。
既然rect变量存储的Rectangle对象在堆中的地址,自然可以使用rect来访问对象的成员变量和成员方法了。
一个对象的引用可以理解为指向一个具体的、已经创建的对象,如果没有指向任何对象,在该引用为null。一个对象的引用不能同时指向多个对象,这一点也容易理解,为某一对象分配的内存只能存储一个对象,这段内存的地址也是唯一的。
多个对象引用变量可以指向同一个对象,看下面的代码:
Rectangle rect; rect = new Rectangle(); Rectangle rect1 = rect;
rect1也是Rectangle类型的变量,rect把对象的引用把赋值给rect1,此时rect和rect1指向同一个Rectangle对象。