为什么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 ; 对于其他修饰符 ,程序会给出编译器错误 。 这是为什么? 请详细解释。

简而言之 – 在这种情况下,其他任何修饰语都没有意义。 将变量设置为publicprivateprotectedstatic只是在本地变量的上下文中没有意义,一旦该方法退出,该变量将超出范围(并被垃圾收集)。 这些修饰符用于类字段 (和方法),以定义它们的可见性(或者在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 

所以唯一可接受的VariableModifierfinal (和一个注释,很少见)。

我相信这是因为其他修饰符适用于类而不是方法。

private,protected或public修饰符会影响全局变量对其他类对象的可见性,因此将这些修饰符用于局部变量是非语义的。

静态修饰符声明一个全局变量属于一个类而不是一个类的对象,因此将它们用于局部变量也没有意义。

唯一有意义的修饰符是“final”,它确保局部变量在方法中不会发生变化。