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

时间:2018-12-20 06:22:00

标签: java declaration keyword final

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

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

5 个答案:

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

  1. final fielddefinely 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);