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知识, 可以 点我进入目录页
- JAVA 引用类型数组的初始化
- 引用类型数组的初始化
- 引用类型数组的初始化
- 引用类型数组初始化
- (三)引用类型数组的初始化
- 在循环中总是显示初始化引用类型的数组
- javaSE学习15_引用类型数组的初始化
- 四张內存变化图揭秘引用类型数组的初始化
- Java数组类型的定义和初始化
- java基本类型数组初始化
- java基本类型数组初始化
- java基本类型数组初始化
- java基本类型数组初始化
- java基本类型数组初始化
- Java一维数组的声明、初始化和引用
- Java二维数组的声明、初始化和引用
- java 当中引用类型数组
- 【java基础】引用类型数组初始化中,setter和getter函数空指针问题
- 对称密码获取(OJ)
- printf("%02x\n", c) 之坑------浪费0.5小时
- Android面试一天一题(1 Day)
- 数组和字符串中的开灯问题
- 【OpenCV学习笔记 004】 图像的缩放、Canny边缘检测和图像的二值化
- JAVA 引用类型数组的初始化
- Android之线程池
- 栈与队列-密码翻译(数据结构基础 第3周)
- VIM tab setting
- APK瘦身方案
- Mac 上传项目到gitHub
- 详解MySQL查询语句执行过程1
- Java:String、StringBuffer和StringBuilder的区别
- 一言不合你就用环信搞个直播APP