JAVA 引用类型数组的初始化

版权声明:本文为博主原创文章,未经博主允许可以转载,但请保留原文链接。 https://blog.csdn.net/tmdlife/article/details/51794237

本页面更新日期: 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知识, 可以 点我进入目录页

猜你喜欢

转载自blog.csdn.net/tmdlife/article/details/51794237