引用类型数组指向的元素也是引用。其本质是:
- 由一个在栈上的引用数组变量指向一块堆内存;
- 这块堆内存里存储的元素是引用,又分别指向其他堆内存。
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指向的堆内存。