【问题标题】:in what order are static blocks and static variables in a class executed? [duplicate]类中的静态块和静态变量按什么顺序执行? [复制]
【发布时间】:2012-09-16 16:07:48
【问题描述】:

可能重复:
Java static class initialization

为什么初始化块中更新的是字符串变量而不是整数(即使先写入块)

class NewClass
{
    static 
    {
       System.out.println(NewClass.string+" "+NewClass.integer);
    }

    final static String string="static";
    final static Integer integer=1;

    public static void main(String [] args)//throws Exception
    {
    }
}

我的输出是

static null

P.S: 还注意到字符串变量初始化仅在我插入 final 修饰符时发生在块之前。为什么会这样?为什么不使用整数?我也将其声明为最终静态

【问题讨论】:

  • 用什么编程语言?
  • 这是给定链接的副本吗?

标签: java static final


【解决方案1】:

来自 JLS 的 section 12.4.2,适当剪断:

那么初始化C的过程如下:

  • 然后,初始化最终类变量和接口字段,其值为编译时常量表达式(§8.3.2.1、§9.3.1、§13.4.9、§15.28)。

  • 接下来,按照文本顺序执行类的类变量初始化程序和静态初始化程序,或者接口的字段初始化程序,就好像它们是一个单独的块一样。

因此,对于非编译时常量,这不是“所有变量”然后是“所有静态初始化程序”的情况,反之亦然——它们都是按文本顺序排列在一起的。所以如果你有:

static int x = method("x");

static {
    System.out.println("init 1");
}

static int y = method("y");

static {
    System.out.println("init 2");
}

static int method(String name) {
    System.out.println(name);
    return 0;
}

那么输出将是:

x
init 1
y
init 2

即使将 xy 设为 final 也不会影响这里,因为它们仍然不是编译时常量。

P.S: 还注意到字符串变量的初始化只有在我插入 final 修饰符时才会发生在块之前。

此时,它是一个编译时常量,它的任何使用基本上都是内联的。此外,变量值在其余初始化程序之前分配,如上所述。

JLS 的Section 15.28 定义了编译时常量 - 它包括所有原始值和String,但包装类型,例如Integer

【讨论】:

  • 我很抱歉。仍然很困惑。是什么让字符串成为编译时间常数,为什么整数不一样?
  • @TariqIbrahim:我将编辑一个链接到答案中。
  • 谢谢。我明白了
【解决方案2】:

这里是对您问题的简短直接回答....

static Variable

静态变量在JVM 加载 Class 时执行,Class 实例化 时加载> 或其static method 正在被调用。

static Block or static Initializer Block

静态静态初始化块被初始化Class实例化它的static method被调用之前甚至在它的static variable 被使用之前。

//////// 已编辑部分 /////////

class NewClass {

    final static String string = "static";
    final static Integer integer = 1;

    static {
        System.out.println(NewClas.string + " " + NewClas.integer);
    }

    public static void main(String [] args) { // throws Exception
        new NewClas();
    }

}

上面将打印static 1

原因是JVM 将执行称为Constant folding优化过程,对常量变量进行预计算。

此外,在你的情况下,结果static null,因为Constant folding应用于原始类型而不是包装对象,在你的情况下它是整数......

【讨论】:

  • 在这种情况下,块应该打印 static 1 对吗?
  • 谢谢你。这帮助清除了很多东西]
【解决方案3】:

它们按给定顺序初始化(字段和静态块),这就是为什么打印值为null,没有为静态块之后定义的静态字段分配任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 2014-05-03
    • 2013-11-02
    • 2013-03-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多