当我只是尝试在 Java 中执行一些程序时。我尝试使用final
变量,我知道final
变量必须在声明时初始化,但在main方法中,它接受final
变量而没有初始化。我不知道是什么原因。任何人都可以告诉我原因。
谢谢
代码:
class name
{
final int b; //here shows error
public static void main(String args[])
{
final int a; // here no error... why?
System.out.println("hai");
}
}
答案 0 :(得分:10)
实例变量级
最终变量只能初始化一次。
类级别的最终变量必须在构造函数结束之前初始化。
本地(方法)级别
所以基本上如果你不使用本地最终变量,你也可以跳过它的初始化。
如果变量是实例级别,则必须在定义或结构体中初始化它。
在您的代码中,您有一个永远不会初始化的实例变量final int b
,因此您有错误。
您还有一个从未使用过的本地变量final int a
。因此,您没有该变量的错误。
答案 1 :(得分:2)
答案在JLS中提供。
变量可以声明为final。最终变量只能分配一次。 如果分配了最终变量,则为编译时错误,除非在分配之前明确未分配。
现在,在局部变量的情况下,它的范围在它声明的块内是有效的。流量将是线性的(从上到下)。因此,编译器可以轻松识别变量首先被初始化的位置。
但是在field
的情况下,除非在Constructor
中进行赋值,否则无法找到首先分配变量的方法。
因此,您必须在声明或构造函数中指定final fields
。
答案 2 :(得分:1)
局部变量没有默认值,bt我们可以像这样声明
final int a; 没有错误 但我们无法访问它。当我们尝试访问它时,就会发生错误。 但这种情况不适用于类变量。
因此,在您访问打印变量值的情况下,会发生错误。 感谢
答案 3 :(得分:-1)
未标记为 final 的实例变量获得默认值,而局部变量不获得默认值。
例如变量“int b”要成为final,它必须在声明时或在构造函数中赋值。
对于 main 方法中的局部变量“int a”,如果它没有被初始化,则不会出错。