当前位置: 首页 > 知识库问答 >
问题:

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

彭俊智
2023-03-14

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

祝叶五
2023-03-14

原语类型的所有字段将自动初始化为默认值
int的值为0。所以a==0。您可以在此处检查默认值<它在非基本类型(类)上有区别<所以
字体a -

何向荣
2023-03-14

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

  • 布尔值:false

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

因此,在“准备”阶段,您的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 0
In static initializing block a is 0 and b is 2
In main a is 0 and b is 2

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

 类似资料:
  • Gradle 需要运行在一个 Java 环境里 安装一个 Java JDK 或者 JRE. 而且 Java 版本必须至少是 6 以上. Gradle 自带 Groovy 库, 所以没必要安装 Groovy. 任何已经安装的 Groovy 会被 Gradle 忽略. Gradle 使用任何已经存在在你的路径中的 JDK (可以通过 java -version 检查, 如果有就说明系统已经安装了 Ja

  • 我刚刚读完Java虚拟机规范,关于类加载的部分让我感到困惑。在阅读了规范之后,就我的总体理解而言,我认为类的整体实例化包括以下步骤,顺序如下: > 链接:类挂接到JVM。如果出错,将抛出的子类。链接包括三个分步骤: > 验证:确保字节流表示Java类,例如字节码没有形式错误,如溢出操作数堆栈的方法字节码。如果类验证失败,则抛出一个。 准备:JVM为所有静态字段分配内存,并可能创建一个实例模板来加速

  • 我想从我的控制器类中处理阶段事件(即隐藏)。所以我所要做的就是添加一个这样的侦听器: 但问题是初始化在该代码之后立即开始: 在此代码之前: 因此,getScene返回null。 我自己找到的唯一解决方法是将侦听器添加到,当它变得不为空时,我得到场景,将我最终检索阶段的侦听器处理添加到它的中。这一切都以将所需的侦听器设置为阶段事件而结束。 我觉得听众太多了。 这是解决我问题的唯一方法吗?

  • 我正在尝试执行以下操作: > 在mvn测试阶段将一些数据库脚本执行到hsqldb中 将该数据库用于测试目的 我能够配置maven,以便每次调用测试阶段时,所有脚本都成功执行,但是(当然有但是),我所有的测试都失败了。 我的配置: pom.xml 测试Spring配置: 输出: 但后来我所有的测试都失败了。我需要你的帮助,找出为什么它不起作用,并帮助我找到解决方案。非常感谢。 @安德鲁洛维诺夫 这是

  • 在使用Optaplanner 6.1.0解决车辆路线问题时,我遇到了错误 Java . lang . illegalstateexception:本地搜索阶段(1)需要从初始化的解决方案开始,但是实体的规划变量(Customer.previousStandstill)未初始化 它从解决开始。[org.optaplanner.core.impl.solver.DefaultSolver](Threa

  • 在JavaFX中,我使用stage1从一个阶段切换到另一个阶段。隐藏();第二阶段。show(); 然而,第二阶段相当大,包含了一大堆元素。所以当我显示()它时,当它第一次弹出时,有一段400毫秒的时间,整个阶段是空的和灰色的。然后所有的元素都出现了。 太难看了。这是在i7上,有一个非常好的图形处理器。 我已经注意到,如果我展示它,然后隐藏它,然后再次展示它,最终的节目从它出现在屏幕上的那一刻起就