为什么Final变量不需要在java的main方法中初始化?

时间:2015-07-24 05:39:27

标签: java final

当我只是尝试在 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");
    }
}

4 个答案:

答案 0 :(得分:10)

实例变量级

  • 最终变量只能初始化一次。

  • 类级别的最终变量必须在构造函数结束之前初始化

本地(方法)级别

  • 方法级别的最终变量只能初始化一次。
  • 必须先使用进行初始化

所以基本上如果你不使用本地最终变量,你也可以跳过它的初始化。

如果变量是实例级别,则必须在定义或结构体中初始化它。

在您的代码中,您有一个永远不会初始化的实例变量final int b,因此您有错误。

您还有一个从未使用过的本地变量final int a。因此,您没有该变量的错误。

答案 1 :(得分:2)

答案在JLS中提供。

  

变量可以声明为final。最终变量只能分配一次。 如果分配了最终变量,则为编译时错误,除非在分配之前明确未分配

What is definitive assignment

现在,在局部变量的情况下,它的范围在它声明的块内是有效的。流量将是线性的(从上到下)。因此,编译器可以轻松识别变量首先被初始化的位置。

但是在field的情况下,除非在Constructor中进行赋值,否则无法找到首先分配变量的方法。

因此,您必须在声明或构造函数中指定final fields

答案 2 :(得分:1)

局部变量没有默认值,bt我们可以像这样声明

final int a; 没有错误 但我们无法访问它。当我们尝试访问它时,就会发生错误。 但这种情况不适用于类变量。

因此,在您访问打印变量值的情况下,会发生错误。 感谢

答案 3 :(得分:-1)

未标记为 final 的实例变量获得默认值,而局部变量不获得默认值。

例如变量“int b”要成为final,它必须在声明时或在构造函数中赋值。

对于 main 方法中的局部变量“int a”,如果它没有被初始化,则不会出错。