【问题标题】:Why aren't array elements initialized in an enhanced for loop?为什么不在增强的 for 循环中初始化数组元素?
【发布时间】:2013-10-28 03:21:16
【问题描述】:

当我使用普通的for循环时,
数组中的所有元素都会正常初始化:

Object[] objs = new Object[10];
for (int i=0;i<objs.length;i++)
        objs[i] = new Object();


但是当我使用 for-each 循环时。
循环后数组元素还是null

Object[] objs = new Object[10];
for (Object obj : objs)
        obj = new Object();


我认为obj 指的是数组中的特定元素,
所以如果我初始化它,数组元素也会被初始化。
为什么没有发生这种情况?

【问题讨论】:

    标签: java arrays for-loop


    【解决方案1】:

    我认为 obj 指的是数组中的特定元素, 所以如果我初始化它,数组元素也会被初始化。 为什么没有发生这种情况?

    不,obj 在循环体的开头具有数组元素的 。它不是数组元素变量的别名。所以像这样的循环(对于数组;对于可迭代对象不同):

    for (Object obj : objs) {
        // Code using obj here
    }
    

    相当于:

    for (int i = 0; i < objs.length; i++) {
        Object obj = objs[i];
        // Code using obj here
    }
    

    有关增强型 for 循环的确切行为的更多详细信息,请参阅 section 14.14.2 of the JLS

    【讨论】:

    • 第 14.14.2 节对此一无所知,但您的回答非常清楚,谢谢!
    • 只是检查一下,这是否仍然意味着 objs[i] 上的方法仍然可以通过 obj 执行 obj.method() 来完成?由于obj 指向objs[i]
    • @SmRndGuy:你所说的“方法......仍然可以完成”是什么意思?您仍然可以通过引用调用方法,但它不会更改数组的内容。
    • 我的意思是obj.method()相当于做objs[i].method()?
    • @SmRndGuy:是的,因为两者具有相同的值——对对象的引用。
    【解决方案2】:
    Object[] objs = new Object[10];
    for (Object obj : objs)
      obj = new Object();
    

    您已经创建了对象所在的空间,但实际上并没有创建对象。这将尝试遍历数组中的对象(如果它们存在)(它们还不存在!)

    Object[] objs = new Object[10];
    for (int i=0; i < objs.length; i++)
      objs[i] = new Object();
    

    这是不同的,因为您只是简单地从 0 数到 9,然后创建 + 将它们存储在数组中的适当位置。

    【讨论】:

    • 如果我理解正确,您的回答与 Jon Skeet 的回答并不完全一致。
    • 他是乔恩·斯基特。我无法与之竞争。
    【解决方案3】:

    您将新值分配给 'obj' 而不是 'objs' ,因此元素为空。您还必须将值分配给 objs:

        Object[] objs = new Object[10];
        for (int k = 0; k < objs.length; k++) {
            objs[k] = new Object();
            System.out.println(objs[k]);
        }
    

    【讨论】:

      【解决方案4】:

      您正在将新对象分配给可以在 for 循环之外访问的数组元素(这是一个可以引用对象的变量)。

      Object[] objs = new Object[10];
      for (int i=0;i<objs.length;i++)
      objs[i] = new Object();
      

      但在每个循环中,您都将新对象分配给局部变量(而不是数组元素)

      Object[] objs = new Object[10];
      for (Object obj : objs){
      obj = new Object(); 
      }
      //obj can not be accessed here
      

      如果我们谈论这条线

           for (Object obj : objs){
      

      那么它的意思就是你将objs元素的值取到局部变量obj中,即为null。

      【讨论】:

        猜你喜欢
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-22
        • 2018-02-19
        • 2020-09-03
        相关资源
        最近更新 更多