一、数组初始化
数组是绝大多数编程语言都会提供的一种复合结构。如果程序中需要多个相同类型的变量时,可以定义一个数组。
Java语言的数组变量是引用类型的变量。
1、Java数组初始化方式:
这里所说的初始化是指:为数组对象的元素分配内存空间,并为数组元素指定初始值。
java是一种静态语言,因此java数组是静态的。所以当数组被初始化之后,该数组的长度不可变。
Java数组的初始化方式有两种:
- 静态初始化:显示指定数组元素初始值,由系统决定数组长度。
- 动态初始化:给出数组长度,由系统为数组元素分配初始值。
进行动态初始化时,系统将为数组元素分配初始值,规则如下:
整型:byte\short\int\long 初始值是0
浮点型:float\double 初始值是0.0
字符类型:char 初始值是'\u0000'
布尔类型:boolean 初始值是false
引用类型:类、接口、数组 初始值是null
示例代码如下:
package com.beijng.array;
public class InitArray {
public static void main(String[] args){
//静态初始化
String[] a = {"shanghai","beijing","henan"};
//静态初始化
String[] b = new String[]{"11","22"};
//动态初始化
String[] c = new String[4];
System.out.println("a数组的长度="+a.length);
System.out.println("b数组的长度="+b.length);
System.out.println("c数组的长度="+c.length);
}
}
--------------------------------------------------------------
结果如下:
a数组的长度=3
b数组的长度=2
c数组的长度=4
注意:(1)Java的数组变量是引用类型的变量,数组变量并不是数组本身,而是指向堆内存中的数组对象。
可以改变一个数组变量的指向。
(2)关于初始化:对于数组变量,它并不需要进行所谓的初始化,只要把数组变量指向一个有效的数组对象即可使用
数组变量。对于Java中的所有的引用变量,都不需要进行初始化操作,只是该引用变量所引用的对象需要进行初始化操
作。如:对象的引用变量不需要进行初始化,对象本身才需要初始化。
(3)关于数组变量内存:数组变量是引用变量,通常存放在栈内存中,而数组对象是保存在堆内存中的连续内存空
间,初始化数组对象就是为该数组对象分配一块连续的内存空间。
2、基本类型数组的初始化:
过程是程序先为数组分配内存空间,然后将数组元素的值存入内存。
package com.beijng.array;
public class InitArray2 {
public static void main(String[] args) {
//定义int[]类型的数组变量,此时该变量并未指向任何有效内存
int[] intArray;
//静态初始化数组,上述变量指向该数组对象的内存
intArray = new int[]{1,2,3,4,5};
}
}
注意:(1)所有局部变量都是放在栈内存中保存的,不管是基本类型的变量还是引用类型的变量,都是存储在各自的
方法栈中。
(2)但是引用类型变量所引用的对象,如数组,Java对象等则总是存储在堆内存中。堆内存中的对象通常不允许直接
访问,只能通过引用变量访问。
(3)容易迷惑的是:引用类型变量什么时候是栈内存中变量本身,什么时候又是其所引用的实际的堆内存中的对象
呢?如上述程序:intArray本质上只是main方法栈区中的引用变量,但是当遇到intArray.length或
者intArray[3]时,系统就会自动变为访问堆内存中的数组对象。
其实容易区分:引用变量类似于C语言的指针,虽然说Java是没有指针的,但我觉得Java语言却是"处处都是指针"。
只要程序通过引用变量访问属性或者调用方法,该引用变量就会被它所引用的对象代替。
3、引用类型数组的初始化:
引用类型数组,其数组元素是引用类型的变量,它指向另外一块内存。
只要在已有数据类型之后增加方括号,就会产生一个新的数组类型,数组元素都可以看做是变量。