Java 使用foreach循环在数组中构造对象

Java 使用foreach循环在数组中构造对象,java,arrays,for-loop,foreach,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]; //f

我一直在学习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);
    }
}
这是可以的,因为瓶子的排列已经被正确地构造了。 当我仅使用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]。水量。

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

尝试:


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

尝试:

你不能

事实上,你自己也在代码中说过:
用于(瓶子瓶子:瓶子)
。您正在创建一个类型为“瓶子”的新变量“瓶子”,foreach将当前迭代分配给该变量。更改局部变量(即使用new指定新值)将无效,在原始数组中保留空值

解决另一个问题:这并不是真正使用foreach,它只是为了迭代目的滥用它;一段简单的时间也可以。你不能

事实上,你自己也在代码中说过:
用于(瓶子瓶子:瓶子)
。您正在创建一个类型为“瓶子”的新变量“瓶子”,foreach将当前迭代分配给该变量。更改局部变量(即使用new指定新值)将无效,在原始数组中保留空值



解决另一个问题:这并不是真正使用foreach,它只是为了迭代目的滥用它;简单的一段时间也会奏效。

你会感到惊讶,但答案是,在foreach循环中更新局部变量
battle
的重复可能不会修改启动该变量的数组的内容。相关:@azurefrog这正是我要问的。那么,在这种情况下,有没有办法使用foreach循环像for循环那样工作呢?你会感到惊讶,但这里的答案是,在foreach循环中更新局部变量
battle
可能会重复,但这绝不会修改从中启动该变量的数组的内容。相关:@azurefrog这正是我要问的。那么,在这种情况下,有没有办法使用foreach循环来像for循环那样工作呢?我认为foreach是更好的选择,但正如我所看到的,它可能会产生一些问题,在这种情况下,for循环的标准非常简单。那么,在这种情况下,您打算使用for循环吗?我想说是的,传统的for循环是最好的。我的理由是你想利用计数器作为索引。在我看来,foreach更适合于集合而不是数组。虽然这段代码可以工作,但在我看来,它的可读性不是很好:没有使用
变量,可能会生成警告(没有使用局部变量瓶的值)。是的。。。要正确回答这个问题,你必须这样写,即使它不是很好的代码。在我给出的代码中,瓶子只是用作foreach循环的工件来迭代数组的索引。。。如果查看数组时未将值分配给数组的索引,则瓶子每次都为null。瓶子在每次迭代时都是对null的引用。在幕后,您正在分配内存空间,以防瓶子需要指向实际的瓶子(),但这并不重要。我认为foreach是更好的选择,但正如我所看到的,它可能会产生一些问题,在这种情况下,standard for loop非常容易。那么,在这种情况下,您打算使用for循环吗?我想说是的,传统的for循环是最好的。我的理由是你想利用计数器作为索引。在我看来,foreach更适合于集合而不是数组。虽然这段代码可以工作,但在我看来,它的可读性不是很好:没有使用
变量,可能会生成警告(没有使用局部变量瓶的值)。是的。。。要正确回答这个问题,你必须这样写,即使它不是很好的代码。在我给出的代码中,瓶子只是用作foreach循环的工件来迭代数组的索引。。。如果查看数组时未将值分配给数组的索引,则瓶子每次都为null。瓶子在每次迭代时都是对null的引用。在幕后,您正在分配内存空间,以防瓶子需要指向实际的瓶子(),但这并不重要。问题是,“[是否]可以使用foreach循环构造数组中的对象?”答案是肯定的,是肯定的,但不是“正确的”。答案实际上是使用foreach,没有骨骼。它编译、运行并实现与传统for循环相同的效果。字面上是的,语义上不是。如果你在一个没有while和常规for循环的世界里,这是一个很好的技巧,但是1)你从循环内部寻址数组,2)你使用计数器。这是一个合法的答案,但在任何情况下,这个解决方案都是没有意义的。我知道它的作用,是的,这是一个合法的答案。你所说的一切,我在我的回答和下面的评论中都提到了。你想在这里实现什么?如果你不喜欢这个问题,就否决这个问题,而不是解决方案。我只是说,由于foreach的性质,从foreach内部分配变量是不可能的。这不是为它准备的。它在下面使用迭代器和一些黑魔法来寻址数组,这两种方法都不允许更改对Iterable(或数组)内部对象的引用
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)
   Bottle[] bottles = new Bottle[3];
   int counter = 0;

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