据我所知,最终变量必须/只能初始化一次,否则编译器会抛出错误。
如果未初始化最终实例变量x
,则在以下代码中将局部变量y
保留为未初始化时,将引发错误,但我没有遇到任何错误:
import java.util.*;
public class test
{
final int x = 5;// if final variable x uninitialized, compilation error occurs
public static void main(String[] args)
{
final int y; // y is not initialized, **no error is thrown**
System.out.println("test program");
}
}
答案 0 :(得分:5)
未使用局部变量,因此可以不进行初始化
尝试使用它时,您会得到编译错误(即使不是final
):
System.out.println("test program" + y);
局部变量y可能尚未初始化
答案 1 :(得分:4)
Java Language Specification并未声明必须分配final
变量 (强调我):
final
变量可能仅分配给一次。
并且:
空白
final
是其声明缺少初始化程序的最终变量。
因此,您的y
变量是空白的final
,并且由于在代码中未对其进行任何引用,因此最好不分配它。
答案 2 :(得分:3)
import java.util.*;
public class test
{
final int x = 5;
public static void main(String[] args)
{
final int y;
System.out.println("test program");
y=6;
y=7;
}
}
y=7
将给出错误:The final local variable y may already have been assigned
。由于它是final
变量,并且已分配给6
。
恕我直言,final
局部变量表示一旦分配,就不能重新分配。但是通过final int y
,您只声明了一个final
变量而没有赋值(初始化),这在Java中是合法的。(但是要使用它,您仍然必须对其进行初始化,否则会发生错误。)
更新:
如下所述,您已经注意到class field
最终变量和local
最终变量之间的区别。
来自Java语言规范:
final field
或definely assigned
中的static initializer
必须是constructor
:
8.3.1.2最终字段 可以将字段声明为final(第4.12.4节)。类变量和实例变量(静态 和非静态字段)可以声明为final。 空白的最终类变量必须由的静态初始化程序明确分配。 声明它的类,或者发生编译时错误(第8.7节,第16.8节)。 必须在每个末尾明确分配一个空白的最终实例变量 声明它的类的构造函数,否则发生编译时错误(第8.8节, §16.9)。
(请注意,非final字段可以保留为未初始化)
2。局部变量(无论是否为final)必须在使用前明确赋予其值:(第4.12.5章,P88 )
•必须先明确给局部变量(第14.4节,第14.14节)提供值。 通过初始化(第14.4节)或分配(第15.26节)使用,可以 使用确定分配规则(第16节(确定分配))进行验证。
答案 3 :(得分:1)
根据最终变量的定义,它们只能初始化一次。在您的代码中,您尚未初始化'y',也没有在任何地方使用它。
但是,如果您执行以下操作,
final int y;
System.out.println(y);
您将获得“变量y可能尚未初始化”
答案 4 :(得分:1)
尝试使用声明的最终变量时会出错。
System.out.println(y);