公共静态决赛需要初始化,但公共决赛不需要初始化

时间:2015-09-07 23:34:36

标签: java static initialization final

我有三个常量浮点数,我希望在类的构造函数中赋值。

我在构造函数之前声明了所有三个常量。作为一项实验,我为每个设置了不同的修饰符:

public static float defaultdim;
public static final float maxdim;
public final float mindim;

我的IDE Eclipse检测到第二个常量maxdim的错误,即:

  

空白的最终字段maxdim可能尚未初始化

让我感到困惑的不是错误出现的原因,而是为什么错误不出现在mindim的情况下,这也是最终的,考虑到错误消息与变量是最终的事实有关。换句话说,错误是因为在声明期间未初始化最终变量。这两个变量都是最终的,并且都没有初始化,但错误只出现在一种情况下。

两个变量因修饰符static而不同,这表明这将是错误的原因。但是,我不明白为什么会出现这种情况,因为在defaultdim的情况下不会出现错误,这只是静态的,而不是最终的,并且错误本身并不引用修饰符static。有谁可以向我解释背后的原因?

2 个答案:

答案 0 :(得分:4)

<强> public static float defaultdim;

static字段,如果您未明确指定值,则会在0.0F的情况下使用默认float进行初始化。 ( ie 如果是int,它将0)此外,它 final

接下来,两个声明都被视为空白最终字段声明,缺少初始值设定项

<强> public static final float maxdim;

每个final字段只能分配一次,然后才能使用它。加载类时初始化static变量,并且由于final它在加载class时必须具有值,但在{{1}的情况下您收到错误(常量)。

<强> static final

在上面的例子中,你没有在代码中的任何地方初始化它,编译器认为你将来也不会再初始化这个变量。您必须在使用它之前对其进行初始化。在这种情况下,您可以通过在构造函数中初始化来避免编译时间错误。

public final float mindim;

通过这样做,您确保编译器public Test(float mindim) { this.mindim = mindim; } 将在代码中的任何位置使用之前进行初始化, note 它不是mindim并且它将具有您为班级创建的每个static的不同副本。

  

但是,如果我需要根据静态最终字段赋值,该怎么办?   传递给类的构造函数的参数?

没有。 Object字段与static final相关,而构造函数Class。加载Object时,应该初始化常量,而在使用class创建Object类时,将调用构造函数。在构造函数中初始化常量没有意义。如果它可以随每个对象而变化,而不是常量。是的,您可以仅保留字段new并根据构造函数参数指定值,因为这样每个final的值都会为final

答案 1 :(得分:0)

因为start上的非静态变量为null