yangmiao212 2009-08-03 10:50
浏览 193
已采纳

foreach内部操作原理

[code="java"]
public class TestArray
{
public static void main(String[] args)
{
Foo[] foos = new Foo[2];
for(int i=0; i<foos.length; i++)
{
foos[i] = new Foo();
}

// for(Foo foo:foos)
// {
// foo = new Foo();
// }

    System.out.println(foos[0].name);
}

}
class Foo
{
String name = "yangmiao";
int age = 10;
}
[/code]
如果使用foreach循环,数组实际上仍然没有初始化,执行print语句会报空指针错误,这是为什么?

  • 写回答

2条回答

  • ZangXT 2009-08-07 19:54
    关注

    可以看一些foreach的原理,对于数组类型,其实
    Foo[] foos = new Foo[2];
    for(Foo foo:foos)

    {

    foo = new Foo();

    }
    其实是这样执行的
    Foo[] foos2 = foos;
    int i = foos2.length;
    for(int j = 0;j<i;j++){
    Foo foo = foos2[j];
    foo = new Foo();
    }

    可以发现,foo只是个副本,修改了foo对foos[i]并没有影响。

    这一点可以通过分析反编译后的bytecode得知。
    也可以使用jad,对foreach的程序进行反编译,得到for版本的代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?