未初始化的最终局部变量与未初始化的最终实例变量

Un-initialized final local variable vs un-initialized final instance variable

据我所知,最终变量 must/can 只能初始化一次,否则编译器应该会抛出错误。

如果最终实例变量 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");
 }
}

未使用局部变量,因此可以保持未初始化状态

尝试使用它时会出现编译错误(即使不是final):

 System.out.println("test program" + y);

The local variable y may not have been initialized

根据final变量的定义,它们只能被初始化一次。在您的代码中,您还没有初始化 'y' 并且您也没有在任何地方使用它。

但是如果您执行以下操作,

final int y;
System.out.println(y);

你会得到'variable y might not have been initialized'

当您尝试使用已声明的 final 变量时会出现错误。

System.out.println(y);

Java Language Specification 没有声明 final 变量 必须 赋值(强调我的):

A final variable may only be assigned to once.

并且:

A blank final is a final variable whose declaration lacks an initializer.

因此您的 y 变量是一个 空白 final,并且由于您的代码中没有进一步引用它,因此最好将其未分配.

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 语言规范:

  1. a final field 必须是 definely assignedstatic initializerconstructor 中:

    8.3.1.2 final Fields A field can be declared final (§4.12.4). Both class and instance variables (static and non-static fields) may be declared final. A blank final class variable must be definitely assigned by a static initializer of the class in which it is declared, or a compile-time error occurs (§8.7, §16.8). A blank final instance variable must be definitely assigned at the end of every constructor of the class in which it is declared, or a compile-time error occurs (§8.8, §16.9).

(注意非final字段可以不初始化)

2.A局部变量(无论是否为final)在使用前必须显式赋值:(chapter 4.12.5,P88)

• A local variable (§14.4, §14.14) must be explicitly given a value before it is used, by either initialization (§14.4) or assignment (§15.26), in a way that can be verified using the rules for definite assignment (§16 (Definite Assignment)).