gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:49:59 24 4
gpt4 key购买 nike

我无法理解以下几行之间的区别(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;

最佳答案

“初始化为默认值”意味着字段设置为以下值:

  • boolean 值:假
  • int、长、字节、短:0
  • double float :+0.0
  • 字符:'\u0000'
  • 引用类型:null

“通过执行初始化器进行初始化”意味着现在分配给这些静态字段的表达式将被计算并分配给它们。

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

<小时/>

使用具有副作用的方法很容易验证这一点。我们不是将简单的“2”分配给 b,而是调用一个返回值 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 0In static initializing block a is 0 and b is 2In main a is 0 and b is 2

此演示还可以警告您有关使用在初始化阶段运行的方法的信息。

关于java - java类加载器的准备阶段和初始化阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29322215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com