Java - 没有设置对象?

时间:2014-01-26 23:05:17

标签: java

考虑以下代码,尝试将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,对象和子句的其余部分都正常运行。

2 个答案:

答案 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]