静态和最终静态赋值

static and final static assignment

我使用的是同一种概念,我在第一个 class.
b 被初始化为 0,我在使用 b 的所有地方都得到 0。 一段时间后,我得到了原因,运行 调试器看到 a 没有被分配任何值,直到函数 call.variable a 只有值默认值 0.

但是当我 运行 class Test2.它给出了输出 5.

我想知道这个初始化是什么时候发生的? 我知道静态变量在编译时获得价值。但是静态最终呢? 这个变量什么时候得到它的值?

public class Test1 {

    static int b=add();
    static int add()
    {
        return a;
    }
    static int a=5;

    public static void main(String[] args) {        
        System.out.println(b);
    }
}
//Gives output 0


public class Test2 {

    static int b=add();
    static int add()
    {
        return a;
    }
    final static int a=5;

    public static void main(String[] args) {    
        System.out.println(b);
    }
}

//gives output 5

原始类型和String类型的final static字段由java编译器专门处理:它们是编译时常量。它们的值只是内联到它使用的代码中。让我们看一下生成的字节码。

Test1 class:

static int add();
Code:
   0: getstatic     #17                 // Field a:I
   3: ireturn

所以它真的加载了一个静态字段。

Test2 class:

static int add();
Code:
   0: iconst_5
   1: ireturn

这里它只是推送一个预定义的常量值5,甚至没有引用常量字段。

来自 Java 语言规范的 12.4.2 部分,初始化 Class 的过程如下:

  • Then, initialize the final class variables and fields of interfaces whose values are compile-time constant expressions (§8.3.2.1, §9.3.1, §13.4.9, §15.28).
  • Next, execute either the class variable initializers and static initializers of the class, or the field initializers of the interface, in textual order, as though they were a single block.

因此最终变量将在静态变量之前被初始化。你会得到输出 5.

只是为了补充其他答案:

在第一个 a 不是最终的情况下,b 的值在 a 之前赋值,这就是你得到 0 的原因。赋值顺序由语句的顺序。如果将 static int a=5; 移动到 b 的赋值语句之前,您将得到 5.