您的位置:首页 > 其它

(三)引用类型数组的初始化

2017-04-13 09:16 211 查看
之前的博客《深入数组--内存中的数组》中用图解的方式展示了普通数组在内存中是怎么存储的,本篇将以同样的方式说明引用类型数组在内存中是如何存储的。

案例:

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实例的实例变量和方法的效果是一样的。

上面的一段代码输出结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: