首页 > 解决方案 > 空白最终字段是否适用于局部变量?

问题描述

Java 8 的Java 规范

空白 final 是一个 final 变量,其声明缺少初始化程序。

这是否意味着空白的最终字段仅用于实例和类变量而不是局部变量,因为初始化程序仅用于实例和类变量?

标签: java

解决方案


这是否意味着空白的最终字段仅用于实例和类变量而不是局部变量,因为初始化程序仅用于实例和类变量?

由于初始化器不仅用于实例和类变量,因此答案是否定的。

初始化器可以是局部变量声明的一部分。例如

public void method() {
    int i = 0;    // this declaration has an initializer
    ...
}

我在问这里的初始化器一词是否在一般意义上使用,即用于任何值或初始化器块。

在您所指的上下文中,不。它专门指的是作为声明一部分的初始化程序。它说:

“ ...一个最终变量,其声明缺少初始化程序。”

假设初始化器在1之后出现(例如在实例或静态初始化器块中,或者稍后在相同或嵌套的方法块中),那么这是一个空白的 final

如果它也是一个字段,那么它是一个空白的 final 字段


最后,以下程序演示了局部变量可以为空白 final

public class Test {     
    public static void main(String[] args) {    
        final int i;    // blank final
        i = 0;  
        System.out.println(i);
    } 
}

这在 Java 11 上编译和运行,并且应该在所有 Java 版本的所有(兼容)实现上编译和运行。


1 - 实际上,JLS 并没有明确禁止完全没有初始化的空白决赛。但是,在使用变量之前必须进行初始化,所以这样的声明是没有意义的。编译器可能会警告您未使用的变量。


推荐阅读