ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 在内部类中使用非final变量

2019-09-01 04:10:24  阅读:269  来源: 互联网

标签:java variables inner-classes


我是Java的新手,并且几天以来一直在做一些基本的编码.今天在处理变量和内部类时,我在内部类中使用非final变量时遇到困难.

我正在使用testNG框架进行工作,所以这是我正在尝试的场景,

=========

public class Dummy extends TestNG {
   @Override
   public void setUp() throws Exception {
      log.error("Setup Goes here");
   }

   @Override
   public void test() throws Exception {
        String someString = null;
        try { 
         someString = "This is some string";
      } catch (Exception e) {
         log.error(e.getMessage());
      }
         Thread executeCommand = new Thread(new Runnable() {
            @Override 
            public void run() {       
               try {
                  runComeCommand(someString, false); <=====ERROR LINE
               } catch (Exception e) {
                  log.error(e.getMessage());
               }
            }
         });
   }

   @Override
   public void cleanUp() throws Exception {
   }
}

==========

当我编写上面的代码时,它抛出一个错误,说“不能引用内部类中的非final变量”.所以我实现了eclips提供的一个建议,即在父类中声明someString变量.现在代码看起来像这样,

==========

public class Dummy extends TestNG {
   String someString = null; <=====Moved this variable from test() to here
   @Override
   public void setUp() throws Exception {
        log.error("Setup Goes here");
   }
   @Override
   public void test() throws Exception {
                <same code goes here>
   }

   @Override
   public void cleanUp() throws Exception {
   }
}

==========

现在它在eclips中没有显示任何错误.
我想知道,为什么它现在接受内部类中的变量,即使它不是最终的.不应该失败并出现同样的错误吗?这会有效吗?任何帮助都会很棒.

解决方法:

在您的第一个示例中,someString是test中的局部变量.您不能引用非最终局部变量,因为内部类将无法观察到该值的更改.通过将该变量声明为final,在内部类中保留另一个引用(并且在创建实例时已知该变量的值).

在第二个示例中,someString不是局部变量,而是实例1.内部类可以从容器对象引用该变量.

标签:java,variables,inner-classes
来源: https://codeday.me/bug/20190901/1780855.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有