在c语言中,通常我们在声明数组的时候,可能不会对其赋初值并且可以指定数组的元素个数,如:
int a[10];
之后的语句可以对数组a[10]进行直接的赋值和操作。
在java中,声明数组会有所不同,如 int[ ] a(或者int a[] ,推荐用第一种,因为第一种的语句更能体现java引用机制]),int[ ]是一个新的数据类型,int在java中是基本类型,int[ ]则是其对应的引用类型,int a[ ]表示定义一个引用变量a,指向一个整型类型的数组,但是java并没有为此数组分配内存空间,所以不能对之赋上数组的长度。
java中,只有对数组进行初始化后,才能使用该数组,数组初始化有两种方式:
1.静态初始化: 程序员在初始化数组时为数组每个元素赋值,如
int a[ ]; //声明
a=new int[ ]{1,2,3,4};//初始化
声明和初始化结合在一起:int [ ] a=new int[ ]{1,2,3,4};
或者,int a [ ]=new int[ ]{1,2,3,4};
但是建议采用分开的方式,因为分两步走的话,第一步是声明数组,第二步是为数组开辟空间;假如在循环中的话,在实际使用的时候开辟空间有利于提高代码的执行效率!
2.动态初始化: 数组初始化时,程序员只指定数组的长度,由系统为每个元素赋初值,如:
int a[ ];
a=new int[10];//int型数组系统为每个元素赋初值0
或者 int a [ ]=new int[10];
int [ ] a=new int[10];
数组是否必须初始化?
对于这个问题,关键在于要弄清楚数组变量和数组对象的差别。数组变量是存放在栈内存中的,数组对象是存放在堆内存中的。数组变量只是一个引用变量,他能够指向实际的数组对象。所谓的数组初始化并非对数组变量初始化,而是对数组对象进行初始化。
对于数组变量来说,它并不需要进行所谓的初始化,只要让数组变量指向一个有效的数组对象,程序即可正常使用该数组变量。
所以,Java语言中的数组,不一定要初始化也可正常使用。如下面的例子:
public class T {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//定义并初始化nums数组
int nums[] = new int[]{3,13,4,6};
//定义一个prices数组变量
int prices[];
//让prices数组指向nums所引用的数组
prices = nums;
for(int i=0;i<prices.length;i++){
System.out.println(prices[i]);
}
//将prices数组的第三个元素赋值为100
prices[2] = 100;
//访问nums数组的第三个元素 将看到100
System.out.println(nums[2]);
}
}
从上面代码可以看出,定义了prices数组之后,并未对prices数组进行初始化。 当执行int prices[]之后,
程序的内存分配如图
从图可以看出,此时的prices数组还未指向任何有效的内存,未指向任何数组对象,此时的程序还不可使用prices数组变量。
当程序执行prices = nums之后,prices变量将指向nums变量所引用的数组,此时prices变量和nums变量引用同一个数组对象。
执行这条语句之后,prices变量已经指向有效的内存及一个长度为4的数组对象,因此程序完全可以正常使用prices变量了。