在使用Java局部内部类或者内部类时,若该类调用了所在方法的局部变量,则该局部变量必须使用final关键字来修饰,否则将会出现编译错误“Cannot refer to a non-final variable * inside an inner class defined in a different method” 下面通过一段代码来演示和分析原因。

public class Example {

    public static void main(String args[]) {
doSomething();
} private static void doSomething() {
final String str1 = "Hello";
// String str2 = "World!";
// 创建一个方法里的局部内部类
class Test {
public void out() {
System.out.println(str1);
// System.out.println(str2);
}
}
Test test = new Test();
test.out(); } }

上面代码若去掉第9行和第14行的注释符号,则第14行就会给出“Cannot refer to a non-final variable * inside an inner class defined in a different method”这样的编译错误。原因如下:在方法中定义的变量是局部变量,当方法返回时,局部变量(str1,str2)对应的栈就被回收了,当方法内部类去访问局部变量时就会发生错误。当在变量前加上final时,变量就不在是真的变量了,成了常量,这样在编译器进行编译时(即编译阶段)就会用变量的值来代替变量,这样就不会出现变量清除后,再访问变量的错误。

本文转载自:http://www.xue5.com/Developer/Software/717058.html

JAVA错误:Cannot refer to a non-final variable * inside an inner class defined in a different method的更多相关文章

  1. annot refer to a non-final variable * inside an inner class defined in a different method"错误解析

    在使用Java局部内部类或者匿名内部类时,若该类调用了所在方法的局部变量,则该局部变量必须使用final关键字来修饰,否则将会出现编译错误“Cannot refer to a non-final va ...

  2. Cannot refer to a non-final variable inside an inner class defined in a different method

    http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-clas ...

  3. 为什么java内部类访问局部变量必须声明为final?

    https://blog.csdn.net/z55887/article/details/49229491 先抛出让我疑惑了很久的一个问题 编程时,在线程中使用局部变量时候经常编译器会提示:局部变量必 ...

  4. Java并发(十九):final实现原理

    final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量. 一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编 ...

  5. 【java】关于Cannot refer to the non-final local variable list defined in an enclosing scope解决方法

    今天学习中遇到了一个问题: Cannot refer to the non-final local variable list defined in an enclosing scope 这里的new ...

  6. 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案

    基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案 最近在研究Java,涉及命令行编译,使用notepad++编辑器,然后使用javac编译: 之前的几个文件没有中文的内容,都没 ...

  7. 【Java学习笔记之二十】final关键字在Java继承中的用法小结

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...

  8. 【转】JAVA错误:The public type *** must be defined in its own file***

    出现The public type xxx must be defined in its own file这个问题,是由于定义的JAVA类同文件名不一致.public类必须定义在它自己的文件中. 解决 ...

  9. Java 错误: 找不到或无法加载主类,问题集合

      正确编译命令: javac Hello.java 正确运行命令: java Hello   错误1:H:\code>java Hello.java 错误: 找不到或无法加载主类 Hello. ...

随机推荐

  1. unity, animtion倒放

    AnimationState.speed Description The playback speed of the animation. 1 is normal playback speed. A ...

  2. CSS3 必须要知道的10 个顶级命令

    来源:http://www.cnblogs.com/damonlan/archive/2012/04/23/2465569.html 作者:浪迹天涯 1.边框圆角(Border Radiuas) 这个 ...

  3. 【转】asp.net导出数据到Excel的三种方法

    来源:http://www.cnblogs.com/lishengpeng1982/archive/2008/04/03/1135490.html 原文出处:http://blog.csdn.net/ ...

  4. svn忽略target

    搞了很久,以前好像在菜单里搞了不管用,这次见到了个简单的方法: ---team--与资源库同步--右击target--在右键菜单中选择(添加至svn:ignore)

  5. Shell学习:sed命令

    http://blog.sina.com.cn/s/blog_a56ef5490101cn58.html sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行 ...

  6. 如何查询 Oracle 11g日志

    可使用如下语句查询11g告警日志存放路径: --显示DIAGNOSTIC_DEST的位置 1.show parameter DIAGNOSTIC_DEST;                       ...

  7. My second "last working day"

    时间真快,转眼硕士毕业已经快8年了. 今天是我的第二个last working day.也是我即将结束在外企工作的节点. 说来,毕业的时候,找工作,在确定了最后要去的单位之前,手头已经拿过了10家单位 ...

  8. 【jmeter】WebSerivice测试

    WebSerivice测试计划的取样器有两种方式:HTTP请求.SOAP/XML-RPC Request. 1. 测试计划 启动JMeter,点击测试计划节点上,重命名测试计划:WebserviceT ...

  9. IntelliJ IDEA以不同格式导出数据库的数据

    在数据表内容上点击右键,弹出窗口中先选择Data Extractor SQL Inserts,二级菜单会列出导出数据的类型,这里选择SQL Inserts 然后选择Dump Data菜单中的To Fi ...

  10. vmware 没挂载光盘解决方案

    一定要选中上方的'已连接'