Java类和静态块

时间:2014-07-22 18:56:21

标签: java static

class Hello12 {
    static int b = 10;
    static {
        b = 100;
    }
}

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

在运行上面的代码时,输​​出变为100,因为当我调用Hello类时,首先执行静态块,将b的值设置为100并显示它。 但是当我写这段代码时:

class Hello12 {
    static {
         b = 100;
    }
    static int b = 10;
}

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

这里的输出为10.我希望答案为100,因为一旦执行静态块,它给b的值为100.所以当在main()中,我调用 Hello.b 它应该提到b(= 100)。如何在两个代码中分配给b的内存?

4 个答案:

答案 0 :(得分:50)

在类的“详细初始化过程”中,Section 12.4.2 of the JLS表示:

  

接下来,执行类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,按文本顺序,就像它们是单个块一样。

这意味着它好像第一个例子是:

b = 10;
b = 100;

第二个例子是:

b = 100;
b = 10;

最后一个作业“获胜”,解释你的输出。

答案 1 :(得分:16)

静态块和静态变量按它们在源中出现的顺序初始化。如果您的代码是:

class Hello12 {

  static int b = 10;
  static {
     b = 100;
  }

}

结果是100。

答案 2 :(得分:6)

除了回答代码如何以什么顺序执行的问题之外,我猜你也想知道为什么静态块可以引用尚未文本声明/执行的静态变量。

虽然section 12.4.2 of the JLS确实解释了静态块和静态变量是按它们出现的文本顺序执行的,但section 8.3.3 of the JLS解释了何时可以引用什么,并且您可以看到{{1的条件失败,允许第二个示例中的静态块引用一个静态变量,该变量在文本上没有被声明/执行。

答案 3 :(得分:4)

静态按照它们在程序中出现的顺序进行评估。