java中局部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;"没有任何编译错误呢

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

(*对于那些认为"最终变量如何工作"可能重复的人来说,这不是关于局部和实例最终变量)

规则如下:

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

对其值的访问由变量的简单名称组成(或者,对于字段,由其限定的字段的简单名称)出现在表达式中除的左侧操作数之外的任何位置简单赋值运算符=(§15.26.1)。

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

因此,重要的是,当您访问变量时,最终字段(或任何局部变量)已经被赋值。如果你从未访问过它,就没有什么可强制执行的(值得注意的是,最终局部变量和非最终局部变量的规则是相同的。唯一的区别是最终局部变量不能再次分配给。)

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

对于字段,这并不总是可能的,因此只有在构造函数/静态初始化程序块中初始化了最终字段(取决于字段是否为静态字段),才认为最终字段是明确分配的。

所有这些都在关于确定性赋值的规则中有更详细的描述。

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

最新更新