之前的博客《深入数组--内存中的数组》中用图解的方式展示了普通数组在内存中是怎么存储的,本篇将以同样的方式说明引用类型数组在内存中是如何存储的。
案例:
class Person{ public String name;//名字 public int age;//年龄 public void info(){ System.out.println("我的名字是"+name+",今年"+age+"岁了!"); } } /** * 引用类型数组 */ public class ReferenceArrayTest { public static void main(String[] args){ Person[] students;//定义一个Person[]类型的变量student //动态初始化 students=new Person[2]; //创建Person实例,并初始化 Person p1=new Person(); p1.name="老大"; p1.age=30; Person p2=new Person(); p2.name="老二"; p2.age=20; //将两个对象变量赋值给数组元素 students[0]=p1; students[1]=p2; //下面两段代码执行的结果相同 p1.info(); students[0].info(); } }
下面我从上到下用画图的方式将内存变化进行展示:
1.Person[] students;执行这句代码的时候,表示创建一个类型为Person[]的变量students,此时系统在栈内存中分配空间,但是并为指向任何有效内存空间。
2.执行动态初始化之后,系统为数组分配默认初始值null,从下面的图中可以看出,students的两个数组元素都是null,没有指向任何有效的内存空间,此时的数组元素依然不能直接使用:
3.紧接着定义了两个Person对象,并赋值,这是系统实际上分配了4块内存,栈中2个存放p1、p2两个引用变量,堆中存放2个Person实例,此时数组元素依旧没有指向有效内存单元:
4.将p1、p2赋值给数组元素,此时这两个数组元素才会指向有效的内存单元。
从上面的图可以看出,students的第一个元素和p1指向同一个内存区,而且它们都是引用类型变量,所以用student[1]和p1访问Person实例的实例变量和方法的效果是一样的。
上面的一段代码输出结果: