java类加载器的准备阶段和初始化阶段

时间:2015-03-28 20:26:23

标签: java classloader

我无法理解以下行(http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.2

之间的区别

A)准备工作涉及将静态字段初始化为默认值。

B)类的初始化包括为类中声明的静态字段(类变量)执行初始化。

是否意味着'a'将在“准备”阶段分配默认值,而'b'将在“初始化”阶段分配值:

static int a;  
static int b=2;

2 个答案:

答案 0 :(得分:2)

“初始化为默认值”表示字段设置为以下值:

  • 布尔值:false
  • int,long,byte,short:0
  • double,float:+0.0
  • char:'\ u0000'
  • 引用类型:null

“通过执行初始值设定项初始化”意味着现在将评估分配给这些静态字段的表达式并将其分配给它们。

因此,在“准备”阶段,您的ab将会被创建并获得值0。在“初始化”阶段,b将收到值2


使用具有副作用的方法很容易验证。我们调用一个返回值b的静态方法,而不是将简单的“2”赋给2,而是在执行此操作之前打印有关变量的信息:

public class SimpleTest {

    private static int a;
    private static int b = printAAndBReturning2("initializer");

    static {
        printAAndBReturning2("static initializing block");
    }

    public static void main(String[] args) {

        printAAndBReturning2("main");

    }

    public static int printAAndBReturning2(String where) {
        System.out.printf("In %s a is %d and b is %d%n", where, SimpleTest.a, SimpleTest.b);
        return 2;
    }
}

输出结果为:

In initializer a is 0 and b is 0
In static initializing block a is 0 and b is 2
In main a is 0 and b is 2

此演示还用于警告您使用在初始化阶段运行的方法。

答案 1 :(得分:0)

原始类型的所有字段都将自动初始化为默认值 因为int是0.所以a == 0。您可以查看默认值here 它在非原始类型(类)上有所不同 所以
Font a; - > a == null(如果您尝试使用a的方法,则会获得a is not initialized Font b = new Font("Dialog", 16, Font.BOLD); - > b == ...(我想你明白了。)