我知道这可能会得到一次投票,但这是让我感到有趣的事情
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;"
这是否意味着最终实例变量和最终局部变量完全不同
(*对于认为这可能与最终变量的工作方式重复的人而言,',这不是关于本地和实例的最终变量)
答案 0 :(得分:4)
规则如下:
每个局部变量(§14.4)和每个空白的最终字段(§4.12.4, §8.3.1.2)在访问时必须具有明确赋值 值发生。
对其值的访问包含变量的简单名称 (或者,对于字段,由此限定的字段的简单名称) 发生在表达式中的任何地方,除了作为左边的操作数 简单赋值运算符=(§15.26.1)。
对于局部变量或空白最终字段x的每次访问,x必须为 在访问之前明确分配,或发生编译时错误。
重要的是,当您访问变量时,已经分配了最终字段(或任何局部变量)。如果您从未访问过它,则无需执行任何操作。 (值得注意的是,最终和非最终局部变量的规则是相同的。唯一的区别是最终的局部变量不能再分配给 。)
使用局部变量,编译器可以保证不访问它,因此不需要分配。
使用字段并不总是可行,因此如果在构造函数/静态初始化块中初始化最终字段(取决于字段是否为静态),则仅认为最终字段是明确赋值的。
所有这些都在Definite Assignment的规则中有更详细的描述。
答案 1 :(得分:1)
您的局部变量c不会出错,因为它不是静态字段。您的实例变量被定义为静态final,因此需要初始化。