首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -静态初始化之前静态变量的默认初始化

问Java -静态初始化之前静态变量的默认初始化
EN

Stack Overflow用户
提问于 2018-03-28 20:12:33
回答 1查看 1.6K关注 0票数 3

我想知道静态变量的默认初始化是在静态初始化之前还是与它一起进行?

让我们看看下面的代码:

代码语言:javascript
复制
class Test {

    static {
        System.out.println(Test.a);  // prints 0
        a = 99; // a get 99
        System.out.println(Test.a); // prints 99
    }

    static int a = 10;

    static {
        System.out.println(a); // prints 10
    }

    public static void main(String[] args) {

    }
}

我的猜测是,当类被加载时,所有的静态变量都是在内存中创建的,并且只是在内存和默认值中创建的。然后,在代码中出现的顺序、静态初始化器和静态字段中进行静态初始化。我说得对吗?

编辑:我知道静态初始化的顺序,但是我无法在JLS中知道默认初始化发生在静态初始化之前?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-28 20:22:28

你是正确的。

静态字段和初始化器确实按照声明的顺序执行:

12.4.2. Detailed Initialization Procedure 接下来,按照文本顺序执行类的类变量初始化器和静态初始化器,或接口的字段初始化器,就像它们是单个块一样。

在运行时,每个类变量实际上都是用默认值初始化的:

4.12.5. Initial Values of Variables ..。 每个类变量、实例变量或数组组件在创建时都会使用默认值初始化(§15.9,§15.10): 对于类型字节,默认值为零,即(字节)0的值。 对于类型短,默认值为零,即( short )0的值。 对于int类型,默认值为零,即0。..。

这就是为什么实际的行为:

代码语言:javascript
复制
static {
    System.out.println(Test.a);  // prints 0 -> default value for `int`
    a = 99; // a get 99
    System.out.println(Test.a); // prints 99 -> value after previous statement executed
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49543368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档