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

4

3 回答 3

11

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

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

于 2013-10-03T18:45:36.863 回答
0

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

有关更多详细信息,请始终查看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(和注释,这很少见)。

于 2013-10-03T18:46:07.373 回答
0

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

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

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

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

于 2013-10-03T18:47:13.843 回答