为什么必须初始化静态final变量?

envsm3lx  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(416)

考虑 static 变量,例如:

private static int x;

如果我们尝试在main方法中打印它的值,它将是0。所以变量被初始化了。现在考虑变量是否为 final :

private static final int x;

这是不可能的;为什么?我们必须像这样初始化它 private static final int x = 2; ,或使用静态初始化器,如:

static {
    x = 2;
}

static 默认情况下初始化变量;那么,如果变量也是 final ?

omtl5h9j

omtl5h9j1#

原则上,这种语言可以让你声明 static final 字段,并让它接受其默认值,但实际上,如果您未能为 static final 那么它几乎总是错的。所以编译器在这里给你一个错误,因为
这段代码做了一些你几乎肯定不想做的事情(或者,没有做一些你几乎肯定想做的事情),并且
默认值将是一些无关紧要的值,如0或0 null ,因此,如果使用该值是您想要的,那么强加给您的不便是最小的;你只要写就行了 static final int x = 0; 而不是 static final int x; .
事实上,被迫写作 = 0 或者 = null 显式地使代码更易于阅读、理解和维护。请记住,大多数代码的读取频率比编写的频率高出数百或数千倍,因此您实际上是在通过更详细和明确的方式节省时间。

czfnxgou

czfnxgou2#

oracle文档中的段落:最后一个修饰符表示此字段的值不能更改。
例如,下面的变量声明定义了一个名为pi的常量,其值是pi的近似值(圆的周长与其直径的比值):

static final double PI = 3.141592653589793;

以这种方式定义的常量不能被重新分配,如果您的程序试图这样做,这是一个编译时错误。按照惯例,常量值的名称用大写字母拼写。如果名称由多个单词组成,则这些单词之间用下划线(\分隔)。
编辑:请检查java语言规范。你问题的答案就在那里。

xxls0lw8

xxls0lw83#

注意:问题标题上的static关键字可以删除,因为您应该初始化所有final变量,而不仅仅是静态final变量。
所有final变量都应该显式初始化,或者在声明点处初始化,或者在声明它的类的每个构造函数中初始化(在本例中,它被命名为blank final variable)。这是因为在第一次赋值后不能更改最终变量值。因此,该语言会发出警告,要求隐式地指定最终变量,以驱动开发人员显式地指定值(即使它是默认值,如整数的“0”)。
此外,在“static final”变量的特定情况下,还可以在声明该变量的类的静态初始值设定项中赋值。

相关问题