为什么final是Java中局部变量的唯一修饰符?

时间:2013-10-03 18:42:32

标签: java jvm

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;
    }
}

此处唯一适用的修饰符为最终; 对于其他修饰符,程序会提供编译器错误。这是为什么?请详细解释。

3 个答案:

答案 0 :(得分:10)

简而言之 - 在这种情况下,其他任何修饰语都没有意义。说变量publicprivateprotectedstatic只是在超出范围的局部变量的上下文中没有意义(并且是垃圾收集)一旦方法退出。这些修饰符用于类字段(和方法),以定义它们的可见性(或static的范围)。

final是唯一一个在局部变量的上下文中有意义的,因为它意味着变量在初始声明后不能被修改,它与访问控制无关。

答案 1 :(得分:0)

考虑所有这些声明都是局部变量声明。

有关更多详细信息,请始终转到Java Language Specification,其中指出局部变量可以由

组成
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(和注释,很少见)。

答案 2 :(得分:0)

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

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

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

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