是否未设置Java-Object?

是否未设置Java-Object?,java,Java,考虑以下代码,尝试将产品对象添加到产品列表,该列表是产品[]类型的数组 public void addItem(Product product) { for (Product p : productList) { if (p != null){ p = product; } } System.out.println(productList[0]); // This yields null. } 与注释一样,

考虑以下代码,尝试将
产品
对象添加到
产品列表
,该列表是
产品[]
类型的数组

public void addItem(Product product) {

    for (Product p : productList) {
        if (p != null){
            p = product;
        }
    }

    System.out.println(productList[0]);  // This yields null.

}
与注释一样,打印结果为
null
。为什么没有设置产品


更新:我已经在
!=null
子句,并且对象和子句的其余部分都正常运行。

不能使用for-each循环(也称为“增强型”for循环)来设置数组变量,因为它在循环内部使用临时变量。您可以使用它来更改数组已持有的对象的状态,因为temp变量将引用同一对象,但不会设置引用本身。解决方案:使用循环的标准

根据Java语言规范:

增强的for语句相当于的basic 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;
    }
}
for(int n;n

从中,您可以看到为什么从未设置
productList[0]
p
是在循环迭代期间设置的,但从不
productList[0]

您不能使用for each循环(也称为“增强型”for循环)来设置数组变量,因为它在循环内使用临时变量。您可以使用它来更改数组已持有的对象的状态,因为temp变量将引用同一对象,但不会设置引用本身。解决方案:使用循环的标准

根据Java语言规范:

增强的for语句相当于的basic 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;
    }
}
for(int n;n

从中,您可以看到为什么从未设置
productList[0]
p
在循环迭代期间被设置,但决不会
productList[0]

在每个循环中,变量
p
是一个临时变量,将
productList
的内容分配给该临时变量。因此,您总是只分配临时变量,而不是分配给列表中的项目

你可能想要这个:

for (int i = 0; i < productList.length; i++)
{
    if (productList[i] == null)
    {
        productList[i] = product;
        break;
    }
}
for(int i=0;i

如果没有
中断
,您可以将
产品
分配给每个
为空的
项(实际上最好使用
布尔值
来处理循环中断,但这也行得通)

在for each循环中,变量
p
是一个临时变量,
productList
的内容将分配给该变量。因此,您总是只分配临时变量,而不是分配给列表中的项目

你可能想要这个:

for (int i = 0; i < productList.length; i++)
{
    if (productList[i] == null)
    {
        productList[i] = product;
        break;
    }
}
for(int i=0;i

如果没有
中断
,您将
产品
分配给每个
为空的
项(实际上最好使用
布尔值
来处理循环中断,但这也行得通)

此外,我假设
addItem()
将要将
产品
粘贴到
产品列表
中的第一个空插槽中。所以它应该是
p==null
。是的,我为拼写错误道歉。代码只是简单地拼凑在一起,以呈现问题,而不是实际的代码,只是试图使其更具可读性。谢谢另外,我假设
addItem()
会将
product
粘贴到
productList
中的第一个空插槽中。所以它应该是
p==null
。是的,我为拼写错误道歉。代码只是简单地拼凑在一起,以呈现问题,而不是实际的代码,只是试图使其更具可读性。谢谢