zoukankan      html  css  js  c++  java
  • annot refer to a non-final variable * inside an inner class defined in a different method"错误解析

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

    [java]
    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(); 
     
        } 
     

    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时,变量就不在是真的变量了,成了常量,这样在编译器进行编译时(即编译阶段)就会用变量的值来代替变量,这样就不会出现变量清除后,再访问变量的错误。

  • 相关阅读:
    vuex基础-Vuex是什么呢?
    (一)熟练HTML5+CSS3,每天复习一遍
    重学巩固你的Vuejs知识体系(下)
    重学巩固你的Vuejs知识体系(上)
    苹果上架的整个流程
    写给前端程序员的英文学习指南
    19期-当你在百度搜索关键字的时候,哪个网站会排在最前面?今天给大家科普一下“网站SEO”
    Linux命令入门篇(三)
    iOS面试基础知识 (二)
    iOS面试基础知识 (一)
  • 原文地址:https://www.cnblogs.com/bdbw2012/p/4583373.html
Copyright © 2011-2022 走看看