java - 静态最终 int v/s 静态 int

标签 java static final

这个问题取 self 的Java test 学习指南。有人能解释一下为什么会这样吗?

此代码打印出数字 5 而不是 12。您能解释一下原因吗?你能解释一下为什么如果第二个变量也是 final 会打印出 12,如果它们都不是 final 会打印出 0 吗?

public class Question26 {
    public static void main(String[] args) {
        System.out.println(Q26.q26.ans);
    }
}

class Q26 {
    public static Q26 q26 = new Q26();
    public int ans;
    private static final int var1 = 5;
    private static int var2 = 7;

    public Q26() {
        ans = var1 + var2;
    }
}

最佳答案

要知道在哪里声明 static 字段的地方是这些字段是按顺序初始化的;你不能写:

public class DoesNotCompile
{
    private static final int foo = 1 + bar; // ERROR: bar is not defined
    private static final int bar = 1;

然而,在你的情况下,情况有些不同:

class Q26 {
    // Declared first, but NOT first to be initialized...
    public static Q26 q26 = new Q26();
    public int ans;
    // The honor befalls to this one, since it is declared `final`
    private static final int var1 = 5;
    private static int var2 = 7; // zero until initialized

    public Q26() {
        ans = var1 + var2;
    }
}

一个未初始化的int的默认值为0;因为你的 Q26 实例是在 var1var2 之前声明的,but 因为 var1 是首先初始化(因为它是final),结果就是你看到的:ans is 5.

与此代码等效的可能是:

class Q26 {
    public static Q26 q26;
    private static final int var1;
    private static int var2;

    static {
        var1 = 5;
        q26 = new Q26();
        var2 = 7;
    }

    public int ans;

    public Q26() {
        ans = var1 + var2;
    }
}

进一步说明:还有静态初始化 block ;并订购这些元素。你不能这样做:

public class DoesNotCompileEither
{
    static {
        foo = 3; // ERROR: what is foo?
    }
    private static final int foo;

如果你把静态初始化器放在 foo的声明下面,那么这将编译:

public class ThisOneCompiles
{
    private static final int foo; // declared
    static {
        foo = 3; // initialized
    }

关于java - 静态最终 int v/s 静态 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22433122/

相关文章:

java - 如何获取由 ";"分隔的字符串内的特定字符串?

java - 使用 while 循环或任何其他方法只接受正整数

java - 使用 NativeMethodAccessor 而不是 GeneratedMethodAccessor 时缺少 Lambda 堆栈跟踪

java - 为什么 System 类声明为 final 并带有私有(private)构造函数?

java - HttpServletRequest 和 HttpServletResponse 声明为最终的

java - 在java中对二维数组进行排序(对所有字母进行排序)

groovy - Groovy 中 static 和 final 修饰符的使用

c++ - 当全局命名空间中的函数声明为静态 C++ 时,这意味着什么?

java - 通过静态方法访问单例的字段

java - Java中 "final class"有什么意义?