日期:2014-05-20  浏览次数:20638 次

关于JAVA局部变量的一个问题
有如下代码
Java code

for(int i=0;i<frameCount; i++)
{
    Frame frame = frames.get(i);
    ......
}

Frame frame = frames.get(0);
......



这两个同名的frame对象,可以同时存在于一个方法中!

但反过来就不行!


Java code

Frame frame = frames.get(0);
......
for(int i=0;i<frameCount; i++)
{
    Frame frame = frames.get(i);
    ......
}




谁给解释一下!


------解决方案--------------------
生命周期不同的缘故,在上面的两个frame,前一个在for循环当中,跳出for循环第一个frame的引用就被销毁了,所以再声明一个frame没问题
在第二个例子当中,前一个frame在方法体中,其作用域包括for循环,在for循环内部同时又声明同名frame这样就会造成命名冲突,Java跟C C++不同,不允许这样的冲突存在,所以报编译错误

关键还是对象引用的生命周期和作用范围的缘故
------解决方案--------------------
在Java语言中,即使作用域不同,其定义的变量名字也不能够相同。这主要是为了提高Java代码的可读性,防止混淆才定义了这条规则。

前面哪种情况定义第二个frame的时候,第一个frame的生命周期已经结束了,所以不存在重复定义的说法,而反过来就……
------解决方案--------------------
第一段代码,Frame frame的作用域是for后面的花括号{},
当for循环结束时,frame的作用域也结束了,而后又声明了一个Frame frame 
与之前的frame是没有关系的。

第二段代码,Frame frame的作用域是涵盖整个for循环的方法体,而当程序
执行到for循环中时,再声明一个Frame frame就与外面的frame冲突了。
------解决方案--------------------
上面的for循环结束后,循环里的frame仅在for循环里有效。