为什么Java不允许在构造函数中初始化静态final变量(例如static final int d)?

时间:2016-04-06 14:16:33

标签: java variables static initialization final

我正在尝试在Java中初始化不同类型的变量。我可以在构造函数中初始化final变量(例如final int b)和静态变量(例如static int c),但我不能在构造函数中初始化静态final变量(例如static final int d)。 IDE还会显示错误消息。

为什么Java不允许在构造函数中初始化静态最终变量?

public class InitialisingFields {
    int a;
    final int b;
    static int c;
    static final int d;

    InitialisingFields(){
        a = 1;
        b = 2;
        c = 3;
        d = 4;
    }

    public static void main(String[] args) {
        InitialisingFields i = new InitialisingFields(); 
    }

}

错误讯息:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot assign a value to final variable d
    at JTO.InitialisingFields.<init>(InitialisingFields.java:22)
    at JTO.InitialisingFields.main(InitialisingFields.java:26)
Java Result: 1

3 个答案:

答案 0 :(得分:6)

静态变量由类的所有实例共享,因此每次创建类的实例时,将再次分配相同的变量。由于它是最终的,因此只能分配一次。因此不允许。

static final变量应保证只分配一次。因此,可以在声明它们的同一表达式中指定它们,也可以在静态初始化程序块中指定它们,该块仅执行一次。

答案 1 :(得分:3)

由于

  1. 必须设置静态变量,无论您是否创建该类的实例,因此它必须在构造函数之外发生;
  2. 它只能设置一次,因此第二次创建实例时无法更改其值。
  3. 您可以在初始化之前读取静态最终变量,其值将是该类型的默认值,例如

    class Nasty {
      static final int foo = yuk();
      static final int bar = 1;
    
      static int yuk() {
        System.out.println(bar);  // prints 0.
        return 99;
      }
    }
    

    然而,这是一个奇怪的案例,几乎肯定不是所期望的。

答案 2 :(得分:0)

您无法重新分配final字段。最终意味着变量无法更改。删除最后,你没事。