考虑以下代码,尝试将Product
对象添加到productList
,这是Product[]
类型的数组。
public void addItem(Product product) {
for (Product p : productList) {
if (p != null){
p = product;
}
}
System.out.println(productList[0]); // This yields null.
}
与评论一样,打印结果为null
。为什么没有设置产品?
更新:我在!= null
子句中运行了debug-printouts,对象和子句的其余部分都正常运行。
答案 0 :(得分:3)
在for-each-循环中,变量p
是一个临时变量,productList
的内容将被分配给该临时变量。因此,您始终只是分配临时变量而不是列表中的项目。
你可能想要这个:
for (int i = 0; i < productList.length; i++)
{
if (productList[i] == null)
{
productList[i] = product;
break;
}
}
如果没有break
,您会将product
分配给每个项null
(实际上最好使用boolean
来处理循环中断,但这也有效)
答案 1 :(得分:2)
您不能使用for-each循环(也称为“增强”for循环)来设置数组变量,因为它在循环内部使用了temp变量。您可以使用它来更改数组已经拥有的对象的状态,因为临时变量将引用同一个对象,但不能设置引用本身。解决方案:使用标准for循环。
来自Java语言规范,§14.14.2:
增强的for语句相当于一个基本的for语句 形式:
for (I #i = Expression.iterator(); #i.hasNext(); ) { VariableModifiersopt TargetType Identifier = (TargetType) #i.next(); Statement }
所以在你的情况下,松散地:
for (int n; n < productList.length; ++n) {
Product p = productList[n];
if (p != null) {
p = product;
}
}
由此可以看出为什么productList[0]
永远不会被设置。在该循环迭代的持续时间内设置p
,但从不productList[0]
。