对象数组与基础类型的数组如int []是不同的。对象数组的每个元素都是对象的管理者,而非对象的本身。

1
2
3
String[] a = new String[10];
System.out.println(a[0]);//显示为null
System.outprintfln(a[0].length());//抛出异常

当通过创建了一个String类型的数组时,这个数组的每一个“格子”里都是String类型的管理者。此时该数组每一个元素管理的都是空的,即null

因此,需要给它每一个元素创建对象,如:

1
2
3
4
for(int i = 0; i < a.length; i++){
a[i] = "" + i;
}

对象数组的 for-each 循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class MyClass {
private int value;

public void set(int val) {
value = val;
}

public int get() {
return value;
}
public static void main(String[] arg){
MyClass []a = new MyClass[10];
for(int i=0;i<10;i++){
a[i] = new MyClass();
a[i].set(1);//赋值为1
}
for(MyClass i: a){
i.set(0);//赋值为0
}
for(MyClass i: a){
System.out.println(i.value);
}
}
}

输出结果为:

1
2
3
4
5
6
7
8
9
10
0
0
0
0
0
0
0
0
0
0

这其中发生的事情是for-each循环中,变量i与a中的元素管理同一个对象,所以调用i.set(0)后,遍历a数组得到的结果也是0。