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

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

案例:

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

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



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值