java

时间:2016-05-21 10:12:07

标签: java variables local final

我知道这可能会得到一次投票,但这是让我感到有趣的事情

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

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

(*对于认为这可能与最终变量的工作方式重复的人而言,',这不是关于本地和实例的最终变量)

2 个答案:

答案 0 :(得分:4)

规则如下:

  

每个局部变量(§14.4)和每个空白的最终字段(§4.12.4,   §8.3.1.2)在访问时必须具有明确赋值   值发生。

     

对其值的访问包含变量的简单名称   (或者,对于字段,由此限定的字段的简单名称)   发生在表达式中的任何地方,除了作为左边的操作数   简单赋值运算符=(§15.26.1)。

     

对于局部变量或空白最终字段x的每次访问,x必须为   在访问之前明确分配,或发生编译时错误。

重要的是,当您访问变量时,已经分配了最终字段(或任何局部变量)。如果您从未访问过它,则无需执行任何操作。 (值得注意的是,最终和非最终局部变量的规则是相同的。唯一的区别是最终的局部变量不能再分配给 。)

使用局部变量,编译器可以保证不访问它,因此不需要分配。

使用字段并不总是可行,因此如果在构造函数/静态初始化块中初始化最终字段(取决于字段是否为静态),则仅认为最终字段是明确赋值的。

所有这些都在Definite Assignment的规则中有更详细的描述。

答案 1 :(得分:1)

您的局部变量c不会出错,因为它不是静态字段。您的实例变量被定义为静态final,因此需要初始化。