Java多态场景下使用ArrayList时增强for循环中Employee e的含义解析
Java增强for(for each)循环核心解释
循环中Employee e的具体含义
增强for循环的通用语法结构为:
for(元素类型 临时变量 : 遍历目标集合/数组) { 循环执行逻辑 }
结合你给出的代码场景:
- 遍历目标
hp.getStaff()是泛型为Employee的ArrayList,存储的所有元素都是Employee类的子类实例(Secretary、Manager、Director、Engineer均满足继承关系) - 声明的
Employee e是每轮迭代从集合中取出元素的临时引用变量,具体特性:- 每执行一轮循环,就会按列表的存储顺序,将当前位置的元素引用赋值给
e;当循环推进到下一个位置时,e会被重新赋值为下一个元素的引用 - 用父类
Employee类型声明这个临时变量完全合法,符合Java向上转型的规则,不需要一开始就写具体的子类类型 - 这个变量本质是元素引用的临时拷贝:修改
e本身的指向不会改动原集合的内容,但通过e调用对象方法、修改对象属性,会直接改动堆内存中对应的原对象实例
- 每执行一轮循环,就会按列表的存储顺序,将当前位置的元素引用赋值给
对应代码的执行逻辑
每轮循环的完整执行流:
- 从员工列表取出当前位置的元素,赋值给临时变量
e - 通过
instanceof判断e实际指向的子类类型 - 将
e强转为对应子类类型后,打印对象类型名称、查询当前元素在列表中的索引位置
相关使用提示
e的作用域仅存在于当前循环体内部,循环退出后这个临时变量就会被销毁,不会对外产生影响- 代码中使用
hp.getStaff().indexOf(e)获取索引的写法可正常运行,但存在效率损耗:每执行一次indexOf都会从头遍历一遍列表匹配元素位置,增强for循环本身没有内置的索引值,如果需要频繁获取索引,建议替换为普通for循环或ListIterator迭代
内容的提问来源于stack exchange,提问作者Manuel de Paduanis
相关产品推荐
相关产品推荐

