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