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

aka*_*wal 5 java final declaration keyword

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

如果最终实例变量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");
 }
}
Run Code Online (Sandbox Code Playgroud)

use*_*900 5

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

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

 System.out.println("test program" + y);
Run Code Online (Sandbox Code Playgroud)

局部变量y可能尚未初始化


Zha*_*ang 3

import java.util.*;\npublic class test\n{\n final int x = 5;\n public static void main(String[] args)\n {\n     final int y;\n     System.out.println("test program");\n     y=6;\n     y=7;   \n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

y=7会给出错误:The final local variable y may already have been assigned。由于它是一个final变量,并且它已被分配给6.

\n\n

恕我直言,final局部变量意味着一旦分配,就不能重新分配。但final int y你只是声明一个final变量而没有赋值(初始化),这在Java中是合法的。(但是为了使用它你仍然必须初始化它,否则会发生错误。)

\n\n

更新:

\n\n

class field如下所述,您已经注意到最终变量和最终变量之间的区别local

\n\n

来自 Java 语言规范:

\n\n
    \n
  1. afinal field必须definely assigned位于static initializer或 中 constructor :\n\n
    \n

    8.3.1.2 Final 字段\n 字段可以声明为 Final (\xc2\xa74.12.4)。类和实例变量(静态和非静态字段)都可以声明为 Final。空白的 Final 类变量必须由声明它的类的静态初始值设定项明确指定,或者由编译器指定。发生时间错误 (\xc2\xa78.7, \xc2\xa716.8)。\n 必须在声明该变量的类的每个\n 构造函数的末尾明确分配一个空白的最终实例变量,或者编译- 发生时间错误(\xc2\xa78.8,\n \xc2\xa716.9)。

    \n
  2. \n
\n\n

(请注意,非最终字段可以保留未初始化状态)

\n\n

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

\n\n
\n

\xe2\x80\xa2 局部变量 (\xc2\xa714.4, \xc2\xa714.14) 在使用之前必须通过初始化 (\xc2\xa714.4) 或赋值显式指定一个值(\xc2\xa715.26),可以使用明确赋值的规则进行验证(\xc2\xa716 (明确赋值))。

\n
\n