首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类最终的静态初始化在超类初始化之前?

子类最终的静态初始化在超类初始化之前?
EN

Stack Overflow用户
提问于 2016-08-23 21:59:53
回答 1查看 83关注 0票数 2

我找不到任何具体的,所以在帖子中提到了这个具体的案例,所以我想问一下,我认为什么是“是/否”的问题。

下面是JLS§12.4.2 (Java 8),清单6-7:

  1. ..。然后,初始化C的静态字段,它们是常数变量 (§4.12.4,§8.3.2,§9.3.1)。
  2. 接下来,如果C是一个类而不是一个接口,并且它的超类还没有初始化,那么就让SC作为它的超类.对于列表SC、SI1、.、SIn中的每个S,递归地为S执行整个过程。如果有必要,首先验证和准备S。..。

我的问题是:它是否意味着子类的最终静态变量是在超类的静态初始化之前初始化的(假设最终的静态变量是作为声明的一部分初始化的)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-23 22:10:29

答案可能是这样的。关键部分是一个常量词的意思。

考虑一下这段代码

代码语言:javascript
复制
class Foo {
    public static final int FOO_VALUE = 1000;

    static {
        System.err.println("FOO Bar.BAR_VALUE=" + Bar.BAR_VALUE);
    }
}

class Bar extends Foo {
    public static final int BAR_VALUE = 2000;

    static {
        System.err.println("BAR Foo.FOO_VALUE=" + Foo.FOO_VALUE);
    }
}

这个程序的输出将是

代码语言:javascript
复制
FOO Bar.BAR_VALUE=2000
BAR Foo.FOO_VALUE=1000

在这种情况下,Bar静态最终变量在Foo静态初始化之前被初始化。FOO_VALUEBAR_VALUE都是常量,因此javac可以内联这个字段。

但是,您可以通过这样假装最终变量不是常量来欺骗编译器。

代码语言:javascript
复制
class Foo {
    public static final int FOO_VALUE = Integer.valueOf(1000).intValue();

    static {
        System.err.println("FOO " + Bar.BAR_VALUE);
    }
}

class Bar extends Foo {
    public static final int BAR_VALUE =  Integer.valueOf(2000).intValue();

    static {
        System.err.println("BAR " + Foo.FOO_VALUE);
    }
}

输出将是

代码语言:javascript
复制
FOO Bar.BAR_VALUE=0
BAR Foo.FOO_VALUE=1000

因此,Foo静态初始化器是在静态最终Bar.BAR_VALUE被初始化之前完成的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39111345

复制
相关文章

相似问题

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