java 中局部最终变量的行为

behaviour of local final variable in java

我知道这可能会遭到反对,但这让我很感兴趣

    public class finaltesting
{

    public static final String  v=900; //requires initialization


    public static void main(String []args)
    {
        final int c; // doesn't need initialization
        switch(get())
        {
            case 0:
            System.out.println("zero");
            break;
            case 1:
            System.out.println("one");
            break;
            case 2:
            System.out.println("two");
            break;
            case 3:
            System.out.println("three");
        }

    }
    static int get()
    {
        return (int)(Math.random()*4);

    }
}

但是最终变量需要正确初始化..所以为什么 "final int c;"

没有任何编译错误

这是否意味着最终实例变量和最终局部变量完全不同

(*对于那些认为 'how a final variable works' 可能重复的人来说,这不是关于本地和实例最终变量)

您的局部变量 c 没有给出错误,因为它不是静态字段。您的实例变量被定义为静态最终变量,因此需要初始化。

规则是这样的:

Each local variable (§14.4) and every blank final field (§4.12.4, §8.3.1.2) must have a definitely assigned value when any access of its value occurs.

An access to its value consists of the simple name of the variable (or, for a field, the simple name of the field qualified by this) occurring anywhere in an expression except as the left-hand operand of the simple assignment operator = (§15.26.1).

For every access of a local variable or blank final field x, x must be definitely assigned before the access, or a compile-time error occurs.

所以重要的是,当你访问一个变量时,final 字段(或任何局部变量)已经被赋值。如果您从不访问它,则无需执行任何操作。 (值得注意的是,final 和非 final 局部变量的规则是一样的。唯一的区别是 final 局部变量不能再次赋值给 .)

对于局部变量,编译器可以保证它不会被访问,因此不需要赋值。

对于一个字段,这并不总是可能的,因此只有在 constructor/static 初始化程序块中初始化的最终字段才被认为是明确分配的(取决于该字段是否是静态的)。

Definite Assignment.

的规则中对所有这些进行了更详细的描述