我有一个A类。我在A类的方法(甚至主要)中定义另一个B类,B类可以访问它定义的方法范围内的所有变量。这样的术语是什么课程(如B)?有些人一直在说嵌套类或内部类,但IIRC,那些是他们有另一个类作为他们的数据成员的类(有点像C ++中的组合)。
我的问题的第二部分是有些人一直在说当你在另一个类的方法中定义一个类时,那么后一个类(B)访问的第一个类(A)的变量需要宣布最终。这是严格遵守的,为什么会这样?
答案 0 :(得分:0)
根据Java语言规范,这些是"local classes":
本地类是不是其成员的嵌套类(第8节(类)) 任何类和名称(§6.2,§6.7)。
或"anonymous [inner] classes",它们就是那些没有名字的人(例如 Interface x = new Interface() { ...
)。
这些是inner classes的特例,通常我听到人们称之为。{/ p>
至于你的第二个问题,"Any local variable, formal parameter, or exception parameter used but not declared in an inner class must either be declared final or be effectively final (§4.12.4), or a compile-time error occurs where the use is attempted."如果你试图访问非最终的本地变量,那么这是一个编译时错误。显然,如果你想让你的类编译,必须严格遵循这一部分。
我个人没有听到过你不应该访问封闭类的非最终字段的建议,我很确定这是允许的。虽然可以说这些字段应该是最终的,除非它们不可能,但我没有看到任何风格上的原因,这在内部类中应该更重要。从内部类访问字段可能会导致编译器创建和调用合成getter和setter,但这通常是一个次要的性能问题。