当然首先要说明一点,Java的foreach也是用for来实现的,之所以说foreach是为了与传统的for循环区分开。
在我做《JAVA编程思想》访问控制这一章习题8的时候,用到了这样的语句:
当然,不是我想出来的,借鉴了别人的做法(或者说抄袭吧,:))。当时也没细想,运行时才发现不对,因为ca[i](0<=i<3)始终是null。Why? Oh~,上面的语句相当于这样:
其中并没有对ca[index]的赋值操作。是不是这样?验证一下吧
结果
before foreach:
ma: [null, null, null]
in foreach:
x: MyClass@c17164
x: MyClass@1fb8ee3
x: MyClass@61de33
after foreach:
ma: [null, null, null]
看来的确不假啊,虽然x被赋值,但ma本身并没有。由此得出(以数组为例,对于其它数据结构相同):
1. 基本类型:如果你想用foreach获取数组每个元素的值,OK,do it!
结果:
ia: [1, 2, 3, 4, 5]
in foreach:
x: 1
x: 2
x: 3
x: 4
x: 5
2.基本类型:如果你想用foreach来初始化或重新更改元素的值,No way!
结果:
before foreach:
ia: [0, 0, 0, 0, 0]
in foreach:
x: 5
x: 5
x: 5
x: 5
x: 5
after foreach:
ia: [0, 0, 0, 0, 0]
3. 对象:与基本类型类似,可以用foreach获取每个对象,但不能用来初始化或者改变数组元素(是对象引用而不是对象本身)。前面有初始化的例子,看个已经初始化的数组吧
结果:
before foreach:
ma: [MyClass@c17164, MyClass@1fb8ee3, MyClass@61de33]
in foreach:
x: MyClass@14318bb
x: MyClass@ca0b6
x: MyClass@10b30a7
after foreach:
ma: [MyClass@c17164, MyClass@1fb8ee3, MyClass@61de33]
之所以打出类名和对象地址,就是为了看看引用本身。
4.如果想改变数组中引用所指向的对象的内容,No problem, just do it! 这无非又是一个关于对象引用和对象本身的问题。
结果:
before foreach:
ma: [1, 2, 3]
in foreach:
x: 5
x: 5
x: 5
after foreach:
ma: [5, 5, 5]