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

Why Final variable doesn't require initialization in main method in java?

当我只是想在 Java 中做一些程序时。我尝试使用 final 变量,我知道 final变量必须在声明时初始化,但在 main 方法内部它接受 final 变量而不进行初始化。我不知道是什么 reason.Can 谁能告诉我原因。

谢谢

代码:

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");
    }
}

JLS中提供了答案。

A variable can be declared final. A final variable may only be assigned to once. It is a compile-time error if a final variable is assigned to unless it is definitely unassigned immediately prior to the assignment.

What is definitive assignment

现在,对于局部变量,它的作用域在它声明的块内是有效的。并且流程将是线性的(从上到下)。所以编译器可以很容易地识别出变量将首先被初始化的位置。

但是在 field 的情况下,不可能找到哪个方法将首先分配变量,除非它是在 Constructor.

中赋值

因此,您必须在声明期间或构造函数中分配 final fields

对于实例变量级别

  • final 变量只能初始化一次。

  • class级的final变量必须在构造函数结束前初始化

对于本地(方法)级别

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

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

如果变量处于实例级别,则必须在定义或构造函数体中对其进行初始化。

在您的代码中,您有一个从未初始化的实例变量 final int b,因此出现错误。

您还有一个从未使用过的局部变量 final int a。所以你没有那个变量的错误。

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

最终积分; 没有错误 但我们无法访问它。当我们尝试访问它时,就会发生错误。 但这种情况不适用于 class 变量 .

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

如果没有标记为 final 的实例变量将获得默认值,而局部变量则不会获得默认值。

例如变量“int b”是最终的,它必须在声明时或构造函数中赋值。

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