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

标签 java variables static initialization final

<分区>

我正在尝试用 Java 初始化不同类型的变量。我可以在构造函数中初始化最终变量(例如 final int b)和静态变量(例如 static int c),但我不能在构造函数中初始化静态最终变量(例如 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

最佳答案

静态变量由类的所有实例共享,因此每次创建类的实例时,都会再次分配同一个变量。由于是final,所以只能赋值一次。因此这是不允许的。

static final 变量应该保证只被赋值一次。因此,它们既可以在声明它们的同一表达式中赋值,也可以在只执行一次的静态初始化程序 block 中赋值。

关于java - 为什么 Java 不允许在构造函数中初始化 static final 变量(例如 static final int d)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36453848/

相关文章:

java - ViewPager2/Tabs 问题与 ViewModel 状态

java - spring boot logback-spring.xml maxFileSize 不适用于 SizeAndTimeBasedRollingPolicy

Jquery:如何传入 .next 或 .prev 作为函数变量?

javascript - 如何创建私有(private)静态变量?

java - 如何将内容写入自定义 java Properties 文件

java - 导入MySQL备份表名小写

jquery - 在 prepend img src 中使用变量

php代码写入变量

c++ - 在 C++ 中重现静态初始化顺序失败

django - 我们可以在 Django 设置中使用多个 static_url 或 static_root 吗?