错误:从内部类内部访问局部变量 a;需要宣布最终

2024-05-04

class Outer
{
    void m1()
    {
        int a=12;
        class Inner
        {
            void show()
            {
                System.out.println(a);
            }
        }
        new Inner().show();
    }

}

在这里,当我编译此代码时,我收到错误,即局部变量 a 是从内部类中访问的;需要宣布最终。但这里的“int a”是一个局部变量,所以为什么我们需要声明为final才能在内部类中访问。


需要声明局部变量final如果它用在内部类中。对于要在此类内部类中使用的局部变量,Java 在后台获取局部变量的副本并将其放入隐式实例变量中,以便内部类可以访问它。因为它是副本,所以如果值发生更改,副本可能会出错。所以编译器强制你这样做final.

请注意,在 Java 8 中,这可以编译,因为a是“有效最终的”——未声明final,但一旦初始化就不会改变。

JLS 第 8.1.3 节 http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3 states:

任何使用但未在内部类中声明的局部变量、形式参数或异常参数都必须声明为 Final 或实际上为 Final(第 4.12.4 节),否则在尝试使用时会发生编译时错误。

JLS 第 4.12.4 节 http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4 states:

如果局部变量或方法、构造函数、lambda 或异常参数未声明为 Final,则它实际上是 Final,但它绝不会作为赋值运算符 (第 15.26 节) 的左操作数或作为前缀或后缀增量的操作数出现或减运算符(§15.14、§15.15)。

此外,如果满足以下所有条件,则声明缺少初始值设定项的局部变量实际上是最终变量:

  • 它尚未宣布为最终版本。

  • 每当它作为赋值运算符的左操作数出现时,它肯定是未赋值的,并且在赋值之前不是明确赋值的;也就是说,它是绝对未赋值的,并且在赋值的右侧操作数之后不是绝对赋值的(第 16 节(明确赋值))。

  • 它永远不会作为前缀或后缀递增或递减运算符的操作数出现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

错误:从内部类内部访问局部变量 a;需要宣布最终 的相关文章

随机推荐