JAVA 引用类型数组的初始化

来源:互联网 发布:如何生成淘宝数据包 编辑:程序博客网 时间:2024/05/18 03:48

本页面更新日期: 2016年06月30日

引用类型数组的数组元素是 引用.
我们之前学习过的基本类型数组, 它里面的数组元素存放的是具体的值.
可以当作我们现实生活中的买房, 基本类型数组呢, 就像是你直接找到了房主.
而引用类型数组就像是你没有直接找到房主, 而是通过中介找到了房主.

为了更好的说明引用类型数组的运行过程, 下面先定义一个 Person 类 (所有类都是引用类型). 关于定义类/对象和引用的详细内容之后我们会讲到, 我们先雾里看花一下. 以下代码只需要看, 不需要敲出来.

class Person{    public int age; //年龄    public double height; //身高    //定义一个 info 方法    public void info()    {        System.out.println("我的年龄是:" + age + "我的身高是:" + height);    }}

下面的代码将定义一个 Person[] 数组, 接着动态初始化这个 Person[] 数组, 并为这个数组的每个数组元素指定值.

public class ReferenceArrayTest{    public static void main(String[] args)    {        //定义一个 students 数组变量, 其类型是 Person[]        Person[] students;        //执行动态初始化        students = new Person[2];        //创建一个 Person 实例, 并将这个 Person 实例赋给 zhang 变量        Person zhang = new Person();        //为zhang所引用的 Person 对象的 age/height赋值        zhang.age = 15;        zhang.height = 158;        //创建一个 Person 实例, 并将这个 Person 实例赋给 lee 变量.        Person lee = new Person();        //为 lee 所引用的 Person 对象的 age/height赋值        lee.age = 16;        lee.height = 161;        //将 zhang 变量的值赋给第一个数组元素        students[0] = zhang;        //将 lee 变量的值赋给第二个数组元素        students[1] = lee;        //下面两行代码的结果完全一样, 因为 lee 和 students[1] 指向的是同一个 Person 实例        lee.info();        students[1].info();    }}

由上面可知, 我们把 lee 赋值给了 students[1] 这个数组元素.
所以它们俩的结果是肯定一定相等的.
这就是我们上面说的, 数组元素里存放的是引用, 而不是具体的值.
下面我们结合示意图进行进一步了解.

执行 Person[] students; 代码时, 这行代码仅仅在 栈内存 定义了一个引用变量.
也就是一个指针, 这个指针并未指向任何有效的内存区. 此时的示意图如下:

这里写图片描述

这时我们对 students 执行动态初始化, 系统将为数组元素分配默认的初始值: null , 如下图所示:

这里写图片描述

null 就是空的, 里面啥也没有.
接着我们用代码定义了 zhang 和 lee 两个 Person实例, 在栈内存中存储了 zhang 和 lee 的两个引用变量, 同时在 堆内存中存储了两个 Person实例.
此时的内存存储示意图如下:

这里写图片描述

此时 students 和 lee / zhang 没有半毛钱的关系.
但是我们为了让它们之间发生关系. 我们用代码把 lee 赋给了 students 数组的第二个元素.
此时, students数组的第二个元素将会指向有效的内存区.
示意图如下:

这里写图片描述

由此可以看出, 此时的 lee 和 students[1] 指向同一个内存区, 而且它们都是引用类型变量, 因为通过 lee 和 students[1] 来访问 Person 实例的实例变量和方法的结果完全一样.
所以, 不管是修改 lee 所指向的 Person 实例的实例变量, 还是修改 students[1] 所指向的 Person 实例的实例变量, 必然互相影响.

比方说, lee 的年龄是 16, 你改为 18. lee 和 students[1] 输出的结果将会是一样的, 因为它们之间产生了关系.

结尾

如果你想学习更多JAVA知识, 可以 点我进入目录页

0 0