Java基础之数组的初始化过程
作者:john_heping
Java基础总结
一、数组初始化
1、数组初始化概念
Java是静态语言,因此Java的数组也是静态的。就是说数组在被初始化后数组的长度是不可改变的。而Java的数组初始化就是给数组对象分配内存空间并且给每个数组元素给予初始值。
数组的几种初始化方式:
静态初始化:程序员决定数组元素的初始值,系统决定长度。
String[] names = new String[]{"张三","李四","王五"}; String[] books = {"射雕英雄传","天龙八部","笑傲江湖"};
动态初始化:程序员只决定数组元素的长度,系统分配元素初始值(通常为null,0等)。
String[] strAll = new String[5];
数组对象的长度初始化后长度就不可改变了,他们在堆内存中已经开辟了对应大小的内存空间。
数组变量是一个引用类型的变量,数组变量在栈内存中指向存放在堆内存中的数组对象。内存分配如下图所示:
2、基本类型数组和引用类型的数组初始化的不同
2.1、基本类型数组初始化
对于基本类型的数组,他们的初始化就是在堆内存中开辟一个固定长度和大小的空间用于存储基本类型数据。
比如int(初始值为0),float(初始值为0.0),char(初始值为‘\u0000’),boolean(初始值为false)等。
对应数组类型只能存储对应的数据,并且可以替换,但唯一不变的是数组的长度大小不会变。
我们看看下面这个方法
public static void main(String[] args){ //动态初始化int数组nums,长度为5 int[] nums = [5]; //给nums数组设置元素 for(i=0;i<5;i++){ nums[i]=i; } }
根据这段代码,我们可以得出它在内存中的变化是怎么样,看下图:
从这个图可以看出,基本类型的数组元素都是存在数组开辟的内存空间中,并且长度不变,元素可以替换。相当于一个瓶子里可以装可乐也可以装雪碧,只要你是液体的就行,瓶子只有那么大只能装那么多。
2.1、引用类型数组初始化
引用类型的数组,它初始化完成后数组长度也是固定的,和基本类型数组不同的地方就是数组对象元素。
基本类型数组元素是存放对应基本类型的元素具体值,而引用类型数组对象元素存放的是引用,这个引用指向堆内存中另一块内存空间。
看例子:
public class Cat{ //体重 public double weight; //年龄 public int age; } public class Test{ public static void main(String[] args){ //定义一个数组变量cats,类型是Cat{} Cat[] cats; //执行动态初始化数组,长度为2 cats = new Cat[2]; //创建两个Cat类型的对象 Cat cat1 = new Cat{} Cat cat2 = new Cat{} //赋值给对象的属性 cat1.weight=45.2; cat1.age=2; cat2.weight=35.5; cat2.age=1; //把对象存入数组元素 cats[0] = cat1; cat2[1] = cat2; } }
根据代码,我们可以知道。我们创建了Cat类型的引用类型数组cats,所以,数组cats中的元素,应该存放Cat对象的引用。
所以我们把对象引用变量cat1,cat2作为cats数组的元素存入数组。
我们继续看内存解析,如下图:
代码执行顺序如上图序号所示,所以在堆内存中,引用类型的数组元素就是一个对象的引用。
它们在赋值过程中相当于是把自己的指向地址给了数组元素,可以说是cat1=cats[0]。
还可以把引用看做是一个堆内存地址指针,它指向的堆内存的对象。
3、数组元素就是变量
看过了上面两个例子,基本类型数组和引用类型数组初始化,我们可以得出一个结论:**数组元素就是变量**。
int[] ints; //int[]数组的元素相当于int类型的变量 String[] strs;//String[]数组的元素相当于String类型的变量 Cat[] cats;//Cat[]数组的元素相当于Cat类型的变量
在引用类型数组初始化的内存图解中也能看出来数组元素就是变量这个结论。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。