Java作用域和生存期(内部类)

Java作用域和生存期(内部类),java,scope,inner-classes,lifetime,Java,Scope,Inner Classes,Lifetime,我需要解释为什么以下代码无法编译(在范围和生命周期方面): 我想这是因为: 在内部类中使用但未声明的任何局部变量必须声明为“final”。因此,在本例中,“local”必须声明为final,因为它的作用域和生存期在main方法中结束(因此需要更改为:final int local=1;) 还有其他建议吗 试着编译一下。编译器输出: ClassInMethod.java:11: local variable local is accessed from within inner class; ne

我需要解释为什么以下代码无法编译(在范围和生命周期方面):

我想这是因为: 在内部类中使用但未声明的任何局部变量必须声明为“final”。因此,在本例中,“local”必须声明为final,因为它的作用域和生存期在main方法中结束(因此需要更改为:final int local=1;)


还有其他建议吗

试着编译一下。编译器输出:

ClassInMethod.java:11: local variable local is accessed from within inner class; needs to be declared final System.out.println(local); ^ 1 error java:11:从内部类访问局部变量local;需要宣布为最终决定 系统输出打印项次(本地); ^ 1错误
试着编译一下。编译器输出:

ClassInMethod.java:11: local variable local is accessed from within inner class; needs to be declared final System.out.println(local); ^ 1 error java:11:从内部类访问局部变量local;需要宣布为最终决定 系统输出打印项次(本地); ^ 1错误
有关编译器如何使用
final
技巧解决内部类问题(即作用域和生存期问题)的说明,请参见。

有关编译器如何使用
final
技巧解决内部类问题(即作用域和生存期问题)的说明,请参见.

必须使局部变量成为final的原因是Java将它们的值复制到内部类的实例中。幕后发生的是编译器生成的字节码(大致)与以下内容对应:

class ClassInMethod {
    public static void main(String[] args) {
        int local = 1;

        // this happens when you do: new Inner()
        ClassInMethod_main_Inner inner = new ClassInMethod_main_Inner();
        inner.local = local;
    }
}

// the inner class
class ClassInMethod_main_Inner {
    int local;

    public void method() {
        System.out.println(local);
    }
}
如果
local
不是
final
,并且可以在实例化
internal
和调用
method()
之间更改其值,则对
method()
的调用将使用
local
的旧值。这可能是不正确的行为。强制执行
final
的原因是为了使内部类的行为更直观


(有些语言没有这个限制,但它需要编译器和运行时的明确支持。Java的开发人员到目前为止还没有决定致力于实现它。)

必须将局部变量设置为final的原因是Java将它们的值复制到内部类的实例中。幕后发生的是编译器生成的字节码(大致)与以下内容对应:

class ClassInMethod {
    public static void main(String[] args) {
        int local = 1;

        // this happens when you do: new Inner()
        ClassInMethod_main_Inner inner = new ClassInMethod_main_Inner();
        inner.local = local;
    }
}

// the inner class
class ClassInMethod_main_Inner {
    int local;

    public void method() {
        System.out.println(local);
    }
}
如果
local
不是
final
,并且可以在实例化
internal
和调用
method()
之间更改其值,则对
method()
的调用将使用
local
的旧值。这可能是不正确的行为。强制执行
final
的原因是为了使内部类的行为更直观


(有些语言没有这个限制,但它需要编译器和运行时的明确支持。Java的开发人员到目前为止还没有决定致力于实现它。)

作业分配?你试过编译它吗?;)它是(因此是标签;);我有。但事实上,我想我找到了答案——如果你对我的第二次尝试感兴趣,请在30秒内查看我的帖子!本页可能有助于解释为什么需要变量为最终变量:家庭作业?你试过编译它吗?;)它是(因此是标签;);我有。但事实上,我想我找到了答案——如果你对我的第二次尝试感兴趣,请在30秒内查看我的帖子!这一页可能有助于解释为什么需要变量是最终的:谢谢,我得到了这么多,我只是想确保我没有遗漏任何东西!谢谢,我得到了这么多我只是想确定我没有错过任何东西!