gpt4 book ai didi

java - 实际上是最终的 - 内部类访问

转载 作者:行者123 更新时间:2023-11-30 06:51:48 25 4
gpt4 key购买 nike

内部类只能访问最终或有效最终变量。但我不明白,为什么无论如何都可以访问实例变量,但局部变量和方法参数必须至少有效地为final?

考虑以下代码:

public class BookStore {   

private static final int taxId = 300000;
public String name;

public String searchBook(final String criteria) {
int count = 0;
int sum = 0;
// name = ""; I can uncomment this -> no compile error
class Enumerator {
String interate(int k) {
System.out.println(name);
System.out.println(sum);
return "";
}
}
// sum++; If I uncomment this, a compile error will be thrown.
return "";
}

}

为什么局部变量+方法参数必须是有效的final?

最佳答案

这一切都与创建实例时捕获的值有关。实例上下文中的内部类始终捕获不可变的外部 this 引用,通过它可以访问实例字段(无论是否可变)。相反,局部变量只能通过其值来捕获,因此变量不能改变,以与捕获的值保持一致。

这是一个设计决策。从技术上讲,a)允许内部类状态未反射(reflect)的后续突变或 b)将每个共享局部变量包装到一个对象中以允许像外部类的实例字段一样的突变,但两者都不允许语言设计者认为不一致或实际上不是本地的本地变量是可以接受的。

¹ 这与 lambda 表达式不同,lambda 表达式仅在实际访问实例变量时捕获 this

关于java - 实际上是最终的 - 内部类访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39889003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com