JAVA 引用类型数组的初始化
2016-06-30 23:24
591 查看
本页面更新日期: 2016年06月30日
引用类型数组的数组元素是 引用.
我们之前学习过的基本类型数组, 它里面的数组元素存放的是具体的值.
可以当作我们现实生活中的买房, 基本类型数组呢, 就像是你直接找到了房主.
而引用类型数组就像是你没有直接找到房主, 而是通过中介找到了房主.
为了更好的说明引用类型数组的运行过程, 下面先定义一个 Person 类 (所有类都是引用类型). 关于定义类/对象和引用的详细内容之后我们会讲到, 我们先雾里看花一下. 以下代码只需要看, 不需要敲出来.
下面的代码将定义一个 Person[] 数组, 接着动态初始化这个 Person[] 数组, 并为这个数组的每个数组元素指定值.
由上面可知, 我们把 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] 输出的结果将会是一样的, 因为它们之间产生了关系.
引用类型数组的数组元素是 引用.
我们之前学习过的基本类型数组, 它里面的数组元素存放的是具体的值.
可以当作我们现实生活中的买房, 基本类型数组呢, 就像是你直接找到了房主.
而引用类型数组就像是你没有直接找到房主, 而是通过中介找到了房主.
为了更好的说明引用类型数组的运行过程, 下面先定义一个 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知识, 可以 点我进入目录页相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序