为什么final是Java中局部变量的唯一修饰符?
class Test { public static void main(String[] args) { private int x = 10; public int y = 20; protected int z = 30; static int w = 40; final int i = 50; } }
唯一适用的修饰符是final ; 对于其他修饰符 ,程序会给出编译器错误 。 这是为什么? 请详细解释。
简而言之 – 在这种情况下,其他任何修饰语都没有意义。 将变量设置为public
, private
, protected
或static
只是在本地变量的上下文中没有意义,一旦该方法退出,该变量将超出范围(并被垃圾收集)。 这些修饰符用于类字段 (和方法),以定义它们的可见性(或者在static
的情况下,它们的范围)。
final
是唯一一个在局部变量的上下文中有意义的,因为它意味着变量在初始声明后不能被修改,它与访问控制无关。
考虑所有这些声明都是局部变量声明。
有关更多详细信息,请始终转到Java语言规范 ,该规范声明可以组成局部变量
LocalVariableDeclarationStatement: LocalVariableDeclaration ; LocalVariableDeclaration: VariableModifiersopt Type VariableDeclarators
哪里
VariableModifiers: VariableModifier VariableModifiers VariableModifier VariableModifier: one of Annotation final VariableDeclarators: VariableDeclarator VariableDeclarators , VariableDeclarator VariableDeclarator: VariableDeclaratorId VariableDeclaratorId = VariableInitializer VariableDeclaratorId: Identifier VariableDeclaratorId [] VariableInitializer: Expression ArrayInitializer
所以唯一可接受的VariableModifier
是final
(和一个注释,很少见)。
我相信这是因为其他修饰符适用于类而不是方法。
private,protected或public修饰符会影响全局变量对其他类对象的可见性,因此将这些修饰符用于局部变量是非语义的。
静态修饰符声明一个全局变量属于一个类而不是一个类的对象,因此将它们用于局部变量也没有意义。
唯一有意义的修饰符是“final”,它确保局部变量在方法中不会发生变化。