引用类型数组指向的元素也是引用。其本质是:
- 由一个在栈上的引用数组变量指向一块堆内存;
- 这块堆内存里存储的元素是引用,又分别指向其他堆内存。
class Person // Person是一个自定义的类
{
public int age;
puiblic double height;
public void info()
{
System.out.println("blablabla...");
}
}
public class ReferenceArrayTest
{
public static void main(String[] args)
{
Person[] students; // 声明一个数组引用变量,其元素是Person类的对象
studens = new Person[2]; // 动态初始化
var zhang = new Person(); // 对象的动态初始化
zhang.age = 15;
zhang.height = 158;
var lee = new Person();
lee.age = 16;
lee.height = 161;
students[0] = zhang; // 赋值,实际上是改变指向
students[1] = lee;
// 以下输出结果是一样的,因为指向的同一块内存
lee.info();
students[1].info();
}
}
- 第5行:数组声明,这时候只是在栈上定义了一个变量,没有指向堆内存,如下图所示:
- 第6行:动态初始化,此时students的每个元素(数组引用变量,或者说就是指针)默认初始化为null,如下图所示:
- 第7~12行:初始化两个对象,类也是引用类型,所以实际上开辟了4块内存:zhang和lee位于栈上,所指向的对象位于堆上。如下图所示:
- 第13~14行:赋值,让students的两个元素(数组引用变量)分别指向zhang和lee指向的堆内存。