使用foreach-loop构造数组中的对象

时间:2017-01-12 19:15:03

标签: java arrays for-loop foreach

我一直在学习java,并想知道是否可以使用foreach循环构造数组内的对象。 使用for-loop非常简单:

public class Bottle {

    double waterAmount;

    Bottle(){
        waterAmount = 1.0;
    }

    public static void main(String[] args) {

        Bottle[] bottles = new Bottle[3];
        //foreach
        for (Bottle bottle : bottles) {
            bottle = new Bottle();
            System.out.println(bottle.waterAmount);
        }
        //for
        for (int i = 0; i<bottles.length;i++){
            bottles[i] = new Bottle();
            System.out.println(bottles[i].waterAmount);
        }

        System.out.println("index 1: " + bottles[1].waterAmount);
    }
}

当我使用for循环运行此程序时,我得到:

1.0
1.0
1.0
index 1: 1.0

这是好的,因为瓶子阵列已经正确构造。 当我仅使用foreach执行它时,有输出:

1.0
1.0
1.0
Exception in thread "main" java.lang.NullPointerException
    at Bottle.main(Bottle.java:31)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

因此,据我所知,foreach内部的瓶子构建了每个瓶子对象,但是它并没有将这些新瓶子放到阵列的每个索引上,这就是为什么我不能参考瓶子[1] ] .waterAmount。

2 个答案:

答案 0 :(得分:2)

是的,你可以做到,但如果我看到那个特定的构造,我想知道为什么这样做而不是仅使用传统的for循环。

尝试:

   Bottle[] bottles = new Bottle[3];
   int counter = 0;

   //foreach
   for (Bottle bottle : bottles) {
        bottles[counter] = new Bottle();
        System.out.println(bottles[counter].waterAmount);
        counter++;
   }

答案 1 :(得分:1)

你做不到。

实际上你在代码中自己说过:for (Bottle bottle : bottles)。您正在创建一个类型为Bottle的新变量瓶,foreach会为其指定当前迭代。更改局部变量(即使用new分配新值)将不起作用,在原始数组中保留空值。

要解决另一个答案:那不是真正使用foreach,它只是为了迭代而滥用它;一段时间也会起作用。