关于for循环内部的final的问题
像上面这样写,中间的for循环是编译报错的
而如果改为下面这样:
for (int i = 0; i < 6; i++) {
final int finalI = i;
new Thread(() -> {
System.out.println(finalI);
}).start();
}
这样写就没有问题了
有点疑惑是为什么增强for循环里面匿名内部类的使用了变量可以不用final 修饰,而如果使用普通for循环的话会提示你要使用final修饰呢?
查看资料:
https://blog.****.net/H_Gao/article/details/52901297 java中增强for循环的原理
增强for循环内部就是使用Iterator实现的,并且由于使用iterator机制,所以在遍历的时候不需要进行size大小的判断,但是需要对要循环的数组或者集合进行null值的判断,如果为null的话会报空指针异常。
另外参考文章:
https://www.cnblogs.com/gslyyq/p/4969170.html 增强for循环要注意的陷阱
个人理解增强for循环中使用的变量其实编译之后实际是集合.next(),并没有使用局部变量(有点绕)
还有一个疑惑是:final变量不是不可被更改吗?每次for循环的时候final int finalI = i; 这里的局部变量finalI(最后一个是大写的I)每次for循环的时候final变量不是发生了改变了吗?但是也并没有编译报错或者运行报错
一开始以为会是for循环中的入栈出栈问题,后来想了想,入栈出栈只是针对方法,这里应该不是这个原因。
又参考了文章:
https://blog.****.net/bupa900318/article/details/80555929 变量作用域
感觉应该是for循环内部的局部变量,每一次for循环后final变量出了这个块的作用域范围就会失效,那么下次循环的时候就又可以使用这个final变量了
个人理解,仅供参考,有问题请留言~