Java 匿名内部类访问外部变量i报错原因及解决方法
在这段代码中,i出现错误是因为在匿名内部类中,对于外部变量i的访问是通过复制的方式进行的。在Java中,当在匿名内部类中访问外部变量时,该变量必须是final或者事实上是final的。\n\n在这段代码中,尽管每次循环都会给temp赋值,但是在匿名内部类中使用的变量是i而不是temp。由于i在循环中是一个可变的变量,因此无法在匿名内部类中使用。这是因为匿名内部类的对象可能在循环结束后才会被执行,而此时循环已经结束,i的值可能已经改变。\n\n为了解决这个问题,可以将int i声明为final或者将其转换为局部变量,然后在匿名内部类中使用该局部变量。\n\n可以使用以下两种方法解决这个问题:\n\n1. 将int i声明为final:\n\nfor(int i=1;i<=13;i++) {\n final int temp = i;\n Runnable r = new Runnable() {\n public void run() {\n System.out.println(Thread.currentThread().getName()+"--"+temp);\n }\n };\n pool.execute(r);\n}\n\n\n2. 将int i转换为局部变量:\n\nfor(int i=1;i<=13;i++) {\n int temp = i;\n Runnable r = new Runnable() {\n public void run() {\n System.out.println(Thread.currentThread().getName()+"--"+temp);\n }\n };\n pool.execute(r);\n}\n\n\n这样做可以确保在匿名内部类中使用的变量是一个固定的值,而不会受到外部循环的影响。
原文地址: https://www.cveoy.top/t/topic/pZG8 著作权归作者所有。请勿转载和采集!